Data wrangling
nyts_data[["nyts2015"]] <- nyts_data[["nyts2015"]] %>%
dplyr::select(psu,
finwgt,
stratum,
Qn1, #Age
Qn2, #Sex
Qn3, #Grade
starts_with("Qn4"), #Hispanic/Latino
starts_with("Qn5"), #Race
starts_with("E",
ignore.case = FALSE),
starts_with("C",
ignore.case = FALSE),
-EFLAVCIGTS,
-CFLAVCIGTS,
-EFLAVCIGAR,
) %>%
rename(Age=Qn1,
female=Qn2,
Grade=Qn3,
Not_HL=Qn4a,
HL_Mex=Qn4b,
HL_PR=Qn4c,
HL_Cub=Qn4d,
HL_Other=Qn4e,
Race_AIAN=Qn5a,
Race_Asian=Qn5b,
Race_BAA=Qn5c,
Race_NHOPI=Qn5d,
Race_White=Qn5e) %>%
mutate(Age=Age+8,
Grade=Grade+5,
brand_ecig=NA,
menthol=NA,
clove_spice=NA,
fruit=NA,
chocolate=NA,
alcoholic_drink=NA,
candy_dessert_sweets=NA,
other=NA,
no_use=NA) %>%
dplyr::select(-starts_with("Q"))
$psu
015438 058470 058688 073025 074170 086754 086998 087425 087656 087664 087896
313 325 221 232 314 347 93 336 397 470 437
087997 172374 172421 172817 172932 173042 173872 174438 215184 243985 244289
192 331 285 205 67 132 119 165 143 253 278
245271 245626 246502 259811 273721 302895 315630 343489 343499 344194 357949
345 36 110 211 254 223 116 259 156 348 251
358133 372861 373688 374028 374781 401600 401625 443836 457980 486439 486537
209 401 221 435 299 292 221 304 136 100 68
486665 487290 515976 515979 516124 516428 516479 516582 530234 530465 559544
320 204 169 219 230 130 166 280 249 279 234
559658 560204 572278 573191 586938 600437 602251 602538 657580 659775 673264
134 58 261 41 101 18 28 216 233 179 295
674219 674776 688472 689762 690405 692299 693273 700933 730119 730385 759375
170 194 96 137 49 65 176 231 275 313 205
772232 772340 787476 787705 789039
286 247 240 184 149
$finwgt
6084.762382383 6084.749363267 6084.748763328 393.890426751 641.647375466
90 61 50 48 48
1462.436434424 593.037596627 895.030720016 342.509547149 934.989137039
47 45 44 37 37
702.57430816 645.096986799 6084.747889789 577.454052555 651.46204257
36 35 34 33 33
929.843069043 452.180288822 541.333365673 729.816382606 835.705455892
33 32 32 32 32
888.382540193 927.94099198 851.768379729 868.130099018 894.645660874
32 32 31 31 31
984.845596021 701.063606043 793.263666402 543.10044387 946.819967478
31 30 30 29 29
1015.462088582 1016.149108108 1019.981866234 1040.468408082 1141.362079889
29 29 29 29 29
1291.939451853 1329.790103112 182.06558616 743.973459478 794.640565906
29 29 28 28 28
898.543444732 1042.833088444 1131.481775528 1373.56145484 366.87804128
28 28 28 28 27
392.039206468 547.833907307 579.457069112 593.219832127 854.809873284
27 27 27 27 27
1048.47425302 1104.835457789 1159.516870486 1816.798230284 6054.100327083
27 27 27 27 27
606.95980431 818.085712533 1146.426800539 706.423256175 775.729833268
26 26 26 25 25
946.112967867 996.981564624 1025.880196581 1063.502080912 1119.667616736
25 25 25 25 25
1294.1057904 1315.317079036 6084.7477331 402.063366229 548.721336409
25 25 25 24 24
636.856583371 679.644603411 715.319618737 785.483271485 812.008313568
24 24 24 24 24
886.558267168 892.891330328 910.523814983 1034.181535833 1078.657221151
24 24 24 24 24
1342.832937151 1746.901437456 424.255231699 572.255680335 772.304638451
24 24 23 23 23
815.808021393 916.165629612 1166.771298082 1225.819285873 1322.399990435
23 23 23 23 23
1374.74354602 1673.993155958 1750.253995437 6036.818568997 660.0342283
23 23 23 23 22
695.66010798 705.225188396 760.691396806 793.377847684 (Other)
22 22 22 22 14820
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
1907 1305 918 391 1738 616 578 144 2821 402 446 233 1875 1954 799 1584
$Age
9 10 11 12 13 14 15 16 17 18 19 NA's
23 5 930 2454 2832 2735 2535 2440 2302 1251 135 69
$female
1 2 NA's
8958 8622 131
$Grade
6 7 8 9 10 11 12 13 NA's
2552 2845 2773 2512 2509 2282 2130 18 90
$Not_HL
1 NA's
12311 5400
$HL_Mex
1 NA's
2736 14975
$HL_PR
1 NA's
536 17175
$HL_Cub
1 NA's
261 17450
$HL_Other
1 NA's
1638 16073
$Race_AIAN
1 NA's
1152 16559
$Race_Asian
1 NA's
1023 16688
$Race_BAA
1 NA's
3600 14111
$Race_NHOPI
1 NA's
493 17218
$Race_White
1 NA's
10853 6858
$ECIGT
1 2 NA's
3713 13681 317
$ECIGAR
1 2 NA's
2918 14379 414
$ESLT
1 2 NA's
1360 15993 358
$EELCIGT
1 2 NA's
4673 12727 311
$EROLLCIGTS
1 2 NA's
862 16134 715
$EBIDIS
1 2 NA's
245 16751 715
$EHOOKAH
1 2 NA's
2244 14752 715
$EPIPE
1 2 NA's
408 16588 715
$ESNUS
1 2 NA's
394 16602 715
$EDISSOLV
1 2 NA's
133 16863 715
$CCIGT
1 2 NA's
1081 16266 364
$CCIGAR
1 2 NA's
1006 16162 543
$CSLT
1 2 NA's
606 16777 328
$CELCIGT
1 2 NA's
1956 15485 270
$CROLLCIGTS
1 2 NA's
368 16576 767
$CBIDIS
1 2 NA's
90 16854 767
$CHOOKAH
1 2 NA's
860 16084 767
$CPIPE
1 2 NA's
137 16807 767
$CSNUS
1 2 NA's
148 16796 767
$CDISSOLV
1 2 NA's
54 16890 767
$brand_ecig
NA's
17711
$menthol
NA's
17711
$clove_spice
NA's
17711
$fruit
NA's
17711
$chocolate
NA's
17711
$alcoholic_drink
NA's
17711
$candy_dessert_sweets
NA's
17711
$other
NA's
17711
$no_use
NA's
17711
#Note about difference between recode and fct_recode
nyts_data[["nyts2015"]] <- nyts_data[["nyts2015"]] %>%
mutate_all(~ replace(., . %in% c("."), NA)) %>%
mutate(Age=as.character(Age),
Grade=as.character(Grade)
) %>%
mutate(Age=recode(Age,
`19` = ">18",
),
female=recode(female,
`1`= FALSE,
`2` = TRUE,
.default = NA,
.missing = NA),
Grade=recode(Grade,
`13` = "Ungraded/Other"),
Not_HL=recode(Not_HL,
`1` = TRUE,
.default = FALSE,
.missing = FALSE)) %>%
mutate_at(vars(starts_with("HL", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("Race", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("E", ignore.case = FALSE),
starts_with("C", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
`2` = FALSE,
.default = NA,
.missing = NA)))
$psu
015438 058470 058688 073025 074170 086754 086998 087425 087656 087664 087896
313 325 221 232 314 347 93 336 397 470 437
087997 172374 172421 172817 172932 173042 173872 174438 215184 243985 244289
192 331 285 205 67 132 119 165 143 253 278
245271 245626 246502 259811 273721 302895 315630 343489 343499 344194 357949
345 36 110 211 254 223 116 259 156 348 251
358133 372861 373688 374028 374781 401600 401625 443836 457980 486439 486537
209 401 221 435 299 292 221 304 136 100 68
486665 487290 515976 515979 516124 516428 516479 516582 530234 530465 559544
320 204 169 219 230 130 166 280 249 279 234
559658 560204 572278 573191 586938 600437 602251 602538 657580 659775 673264
134 58 261 41 101 18 28 216 233 179 295
674219 674776 688472 689762 690405 692299 693273 700933 730119 730385 759375
170 194 96 137 49 65 176 231 275 313 205
772232 772340 787476 787705 789039
286 247 240 184 149
$finwgt
6084.762382383 6084.749363267 6084.748763328 393.890426751 641.647375466
90 61 50 48 48
1462.436434424 593.037596627 895.030720016 342.509547149 934.989137039
47 45 44 37 37
702.57430816 645.096986799 6084.747889789 577.454052555 651.46204257
36 35 34 33 33
929.843069043 452.180288822 541.333365673 729.816382606 835.705455892
33 32 32 32 32
888.382540193 927.94099198 851.768379729 868.130099018 894.645660874
32 32 31 31 31
984.845596021 701.063606043 793.263666402 543.10044387 946.819967478
31 30 30 29 29
1015.462088582 1016.149108108 1019.981866234 1040.468408082 1141.362079889
29 29 29 29 29
1291.939451853 1329.790103112 182.06558616 743.973459478 794.640565906
29 29 28 28 28
898.543444732 1042.833088444 1131.481775528 1373.56145484 366.87804128
28 28 28 28 27
392.039206468 547.833907307 579.457069112 593.219832127 854.809873284
27 27 27 27 27
1048.47425302 1104.835457789 1159.516870486 1816.798230284 6054.100327083
27 27 27 27 27
606.95980431 818.085712533 1146.426800539 706.423256175 775.729833268
26 26 26 25 25
946.112967867 996.981564624 1025.880196581 1063.502080912 1119.667616736
25 25 25 25 25
1294.1057904 1315.317079036 6084.7477331 402.063366229 548.721336409
25 25 25 24 24
636.856583371 679.644603411 715.319618737 785.483271485 812.008313568
24 24 24 24 24
886.558267168 892.891330328 910.523814983 1034.181535833 1078.657221151
24 24 24 24 24
1342.832937151 1746.901437456 424.255231699 572.255680335 772.304638451
24 24 23 23 23
815.808021393 916.165629612 1166.771298082 1225.819285873 1322.399990435
23 23 23 23 23
1374.74354602 1673.993155958 1750.253995437 6036.818568997 660.0342283
23 23 23 23 22
695.66010798 705.225188396 760.691396806 793.377847684 (Other)
22 22 22 22 14820
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
1907 1305 918 391 1738 616 578 144 2821 402 446 233 1875 1954 799 1584
$Age
>18 10 11 12 13 14 15 16 17 18 9 NA's
135 5 930 2454 2832 2735 2535 2440 2302 1251 23 69
$female
FALSE TRUE NA's
8958 8622 131
$Grade
10 11 12 6 7
2509 2282 2130 2552 2845
8 9 Ungraded/Other NA's
2773 2512 18 90
$Not_HL
FALSE TRUE
5400 12311
$HL_Mex
FALSE TRUE
14975 2736
$HL_PR
FALSE TRUE
17175 536
$HL_Cub
FALSE TRUE
17450 261
$HL_Other
FALSE TRUE
16073 1638
$Race_AIAN
FALSE TRUE
16559 1152
$Race_Asian
FALSE TRUE
16688 1023
$Race_BAA
FALSE TRUE
14111 3600
$Race_NHOPI
FALSE TRUE
17218 493
$Race_White
FALSE TRUE
6858 10853
$ECIGT
FALSE TRUE NA's
13681 3713 317
$ECIGAR
FALSE TRUE NA's
14379 2918 414
$ESLT
FALSE TRUE NA's
15993 1360 358
$EELCIGT
FALSE TRUE NA's
12727 4673 311
$EROLLCIGTS
FALSE TRUE NA's
16134 862 715
$EBIDIS
FALSE TRUE NA's
16751 245 715
$EHOOKAH
FALSE TRUE NA's
14752 2244 715
$EPIPE
FALSE TRUE NA's
16588 408 715
$ESNUS
FALSE TRUE NA's
16602 394 715
$EDISSOLV
FALSE TRUE NA's
16863 133 715
$CCIGT
FALSE TRUE NA's
16266 1081 364
$CCIGAR
FALSE TRUE NA's
16162 1006 543
$CSLT
FALSE TRUE NA's
16777 606 328
$CELCIGT
FALSE TRUE NA's
15485 1956 270
$CROLLCIGTS
FALSE TRUE NA's
16576 368 767
$CBIDIS
FALSE TRUE NA's
16854 90 767
$CHOOKAH
FALSE TRUE NA's
16084 860 767
$CPIPE
FALSE TRUE NA's
16807 137 767
$CSNUS
FALSE TRUE NA's
16796 148 767
$CDISSOLV
FALSE TRUE NA's
16890 54 767
$brand_ecig
NA's
17711
$menthol
NA's
17711
$clove_spice
NA's
17711
$fruit
NA's
17711
$chocolate
NA's
17711
$alcoholic_drink
NA's
17711
$candy_dessert_sweets
NA's
17711
$other
NA's
17711
$no_use
NA's
17711
nyts_data[["nyts2016"]] <- nyts_data[["nyts2016"]] %>%
dplyr::select(psu,
finwgt,
stratum,
Q1, #Age
Q2, #Sex
Q3, #Grade
starts_with("Q4"), #Hispanic/Latino
starts_with("Q5"), #Race
starts_with("E",
ignore.case = FALSE),
starts_with("C",
ignore.case = FALSE),
-EFLAVCIGAR,
Q50A, #Menthol # What flavors of tobacco products have you used in the past 30 days? (Select one or more)
Q50B, #Clove or spice
Q50C, #Fruit
Q50D, #Chocolate
Q50E, #Alcoholic Drink
Q50F, #Candy/Desserts/Other Sweets
Q50G, #Some Other Flavor Not Listed Here
Q50H #I Did Not Use Flavored Tobacco Products In the Past
) %>%
rename(Age=Q1,
female=Q2,
Grade=Q3,
Not_HL=Q4A,
HL_Mex=Q4B,
HL_PR=Q4C,
HL_Cub=Q4D,
HL_Other=Q4E,
Race_AIAN=Q5A,
Race_Asian=Q5B,
Race_BAA=Q5C,
Race_NHOPI=Q5D,
Race_White=Q5E,
female=Q2,
menthol=Q50A,
clove_spice=Q50B,
fruit=Q50C,
chocolate=Q50D,
alcoholic_drink=Q50E,
candy_dessert_sweets=Q50F,
other=Q50G,
no_use=Q50H) %>%
mutate(Age = as.numeric(Age) + 8,
Grade = as.numeric(Grade) + 5,
brand_ecig=NA) %>%
dplyr::select(-starts_with("Q"))
sapply(nyts_data[["nyts2016"]], function(x)
summary(
factor(x)
)
)
$psu
073102 074571 086338 086458 086878 087003 087082 087577 087614 087717 087843
132 231 227 80 479 308 78 157 363 111 421
087995 129241 172513 172966 173458 173584 173678 187262 187681 187822 188489
286 236 31 177 322 469 305 103 379 565 369
229430 243383 243436 244656 245190 246395 258577 258711 258847 273327 286879
235 109 248 88 200 181 161 350 64 130 83
300946 314704 314939 316875 329285 344685 372465 373302 373824 388878 400915
336 105 323 165 228 210 367 501 245 231 309
415525 416045 458137 486124 486487 486627 514830 515814 515921 516441 529391
277 371 452 318 133 251 344 450 256 132 333
530915 557654 560847 572477 587266 587583 600628 601255 603284 644416 644656
130 111 309 328 306 140 258 101 167 304 354
673286 687909 688620 689327 689334 689463 690874 692321 692498 701278 731503
308 436 221 368 229 165 157 133 301 144 414
758261 758520 758580 773513 787566
373 373 165 208 157
$finwgt
871.325553937 1294.137423906 1438.420759833 480.328096721 1836.652739308
52 44 44 39 37
460.564361052 688.756981919 376.209171932 967.677487198 321.964869964
36 35 34 33 31
348.981595173 473.352544161 688.65484377 903.144043691 550.786275093
31 31 31 31 30
565.667360783 376.294559675 409.581862696 655.970957179 801.149846011
30 29 29 29 29
498.103814457 505.529262349 644.407869578 675.378921273 1605.713123985
28 28 28 28 28
184.169787561 426.971622861 600.026114872 858.33511763 873.5009733
27 27 27 27 27
904.585522134 1021.75047314 1709.767600953 225.718687325 419.223596249
27 27 27 26 26
512.349969836 517.86340288 718.983714005 898.62053191 78.392010249
26 26 26 26 25
646.941982176 812.140722555 1126.021341565 1199.777295284 1366.024060394
25 25 25 25 25
87.913448816 133.016213317 279.688771464 467.702830527 523.431999531
24 24 24 24 24
567.324960779 620.558359876 632.341563731 964.27945255 980.937057493
24 24 24 24 24
1039.842033152 1112.446942177 1317.836310254 1801.351760923 5924.173597737
24 24 24 24 24
526.09022941 1025.295175524 1594.189712455 2145.451026673 148.779868992
23 23 23 23 22
303.773166351 305.557190486 527.228440322 549.782141174 564.779037412
22 22 22 22 22
618.335209489 734.04886439 768.310439897 779.967411109 930.560748317
22 22 22 22 22
937.586106872 953.254427428 1001.9600149 1282.567263427 1387.558103013
22 22 22 22 22
1578.327459457 5924.05941567 173.430526483 367.733687159 390.275834436
22 22 21 21 21
408.817821295 413.505336139 414.400979608 454.575264221 528.344027409
21 21 21 21 21
556.197272634 647.322112608 665.201650109 699.029992183 730.643402941
21 21 21 21 21
841.459471942 886.34862584 912.379281326 947.907438733 (Other)
21 21 21 21 18123
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
1938 1300 780 627 1756 989 509 775 2906 705 433 386 2027 1906 1975 1663
$Age
9 10 11 12 13 14 15 16 17 18 19 NA's
46 8 1297 2968 3195 3082 2785 2865 2681 1490 162 96
$female
1 2 NA's
10438 10082 155
$Grade
6 7 8 9 10 11 12 13 NA's
3235 3249 3174 2741 2809 2674 2673 16 104
$Not_HL
1 NA's
14202 6473
$HL_Mex
1 NA's
3091 17584
$HL_PR
1 NA's
732 19943
$HL_Cub
1 NA's
190 20485
$HL_Other
1 NA's
2163 18512
$Race_AIAN
1 NA's
1752 18923
$Race_Asian
1 NA's
1567 19108
$Race_BAA
1 NA's
4607 16068
$Race_NHOPI
1 NA's
688 19987
$Race_White
1 NA's
11661 9014
$menthol
1 NA's
833 19842
$clove_spice
1 NA's
113 20562
$fruit
1 NA's
1109 19566
$chocolate
1 NA's
230 20445
$alcoholic_drink
1 NA's
310 20365
$candy_dessert_sweets
1 NA's
700 19975
$other
1 NA's
505 20170
$no_use
1 NA's
17877 2798
$ECIGT
1 2 NA's
3866 16376 433
$ECIGAR
1 2 NA's
3154 17082 439
$ESLT
1 2 NA's
1337 18873 465
$EELCIGT
1 2 NA's
4485 15801 389
$EHOOKAH
1 2 NA's
2140 17846 689
$EROLLCIGTS
1 2 NA's
970 18931 774
$EPIPE
1 2 NA's
467 19434 774
$ESNUS
1 2 NA's
650 19251 774
$EDISSOLV
1 2 NA's
219 19682 774
$EBIDIS
1 2 NA's
184 19717 774
$CCIGT
1 2 NA's
977 19215 483
$CCIGAR
1 2 NA's
1049 19193 433
$CSLT
1 2 NA's
526 19671 478
$CELCIGT
1 2 NA's
1514 18752 409
$CHOOKAH
1 2 NA's
733 19230 712
$CROLLCIGTS
1 2 NA's
481 19371 823
$CPIPE
1 2 NA's
214 19638 823
$CSNUS
1 2 NA's
280 19572 823
$CDISSOLV
1 2 NA's
132 19720 823
$CBIDIS
1 2 NA's
97 19755 823
$brand_ecig
NA's
20675
nyts_data[["nyts2016"]] <- nyts_data[["nyts2016"]] %>%
mutate_all(~ replace(., . %in% c("*", "**"), NA)) %>%
mutate(Age=as.character(Age),
Grade=as.character(Grade)
) %>%
mutate(Age=recode(Age,
`19` = ">18",
),
female=recode(female,
`1`= FALSE,
`2` = TRUE,
.default = NA,
.missing = NA),
Grade=recode(Grade,
`13` = "Ungraded/Other"),
Not_HL=recode(Not_HL,
`1` = TRUE,
.default = FALSE,
.missing = FALSE)) %>%
mutate_at(vars(starts_with("HL", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("Race", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("E", ignore.case = FALSE),
starts_with("C", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
`2` = FALSE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(menthol:no_use),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE)))
sapply(nyts_data[["nyts2016"]], function(x)
summary(
factor(x)
)
)
$psu
073102 074571 086338 086458 086878 087003 087082 087577 087614 087717 087843
132 231 227 80 479 308 78 157 363 111 421
087995 129241 172513 172966 173458 173584 173678 187262 187681 187822 188489
286 236 31 177 322 469 305 103 379 565 369
229430 243383 243436 244656 245190 246395 258577 258711 258847 273327 286879
235 109 248 88 200 181 161 350 64 130 83
300946 314704 314939 316875 329285 344685 372465 373302 373824 388878 400915
336 105 323 165 228 210 367 501 245 231 309
415525 416045 458137 486124 486487 486627 514830 515814 515921 516441 529391
277 371 452 318 133 251 344 450 256 132 333
530915 557654 560847 572477 587266 587583 600628 601255 603284 644416 644656
130 111 309 328 306 140 258 101 167 304 354
673286 687909 688620 689327 689334 689463 690874 692321 692498 701278 731503
308 436 221 368 229 165 157 133 301 144 414
758261 758520 758580 773513 787566
373 373 165 208 157
$finwgt
871.325553937 1294.137423906 1438.420759833 480.328096721 1836.652739308
52 44 44 39 37
460.564361052 688.756981919 376.209171932 967.677487198 321.964869964
36 35 34 33 31
348.981595173 473.352544161 688.65484377 903.144043691 550.786275093
31 31 31 31 30
565.667360783 376.294559675 409.581862696 655.970957179 801.149846011
30 29 29 29 29
498.103814457 505.529262349 644.407869578 675.378921273 1605.713123985
28 28 28 28 28
184.169787561 426.971622861 600.026114872 858.33511763 873.5009733
27 27 27 27 27
904.585522134 1021.75047314 1709.767600953 225.718687325 419.223596249
27 27 27 26 26
512.349969836 517.86340288 718.983714005 898.62053191 78.392010249
26 26 26 26 25
646.941982176 812.140722555 1126.021341565 1199.777295284 1366.024060394
25 25 25 25 25
87.913448816 133.016213317 279.688771464 467.702830527 523.431999531
24 24 24 24 24
567.324960779 620.558359876 632.341563731 964.27945255 980.937057493
24 24 24 24 24
1039.842033152 1112.446942177 1317.836310254 1801.351760923 5924.173597737
24 24 24 24 24
526.09022941 1025.295175524 1594.189712455 2145.451026673 148.779868992
23 23 23 23 22
303.773166351 305.557190486 527.228440322 549.782141174 564.779037412
22 22 22 22 22
618.335209489 734.04886439 768.310439897 779.967411109 930.560748317
22 22 22 22 22
937.586106872 953.254427428 1001.9600149 1282.567263427 1387.558103013
22 22 22 22 22
1578.327459457 5924.05941567 173.430526483 367.733687159 390.275834436
22 22 21 21 21
408.817821295 413.505336139 414.400979608 454.575264221 528.344027409
21 21 21 21 21
556.197272634 647.322112608 665.201650109 699.029992183 730.643402941
21 21 21 21 21
841.459471942 886.34862584 912.379281326 947.907438733 (Other)
21 21 21 21 18123
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
1938 1300 780 627 1756 989 509 775 2906 705 433 386 2027 1906 1975 1663
$Age
>18 10 11 12 13 14 15 16 17 18 9 NA's
162 8 1297 2968 3195 3082 2785 2865 2681 1490 46 96
$female
FALSE TRUE NA's
10438 10082 155
$Grade
10 11 12 6 7
2809 2674 2673 3235 3249
8 9 Ungraded/Other NA's
3174 2741 16 104
$Not_HL
FALSE TRUE
6473 14202
$HL_Mex
FALSE TRUE
17584 3091
$HL_PR
FALSE TRUE
19943 732
$HL_Cub
FALSE TRUE
20485 190
$HL_Other
FALSE TRUE
18512 2163
$Race_AIAN
FALSE TRUE
18923 1752
$Race_Asian
FALSE TRUE
19108 1567
$Race_BAA
FALSE TRUE
16068 4607
$Race_NHOPI
FALSE TRUE
19987 688
$Race_White
FALSE TRUE
9014 11661
$menthol
FALSE TRUE
19842 833
$clove_spice
FALSE TRUE
20562 113
$fruit
FALSE TRUE
19566 1109
$chocolate
FALSE TRUE
20445 230
$alcoholic_drink
FALSE TRUE
20365 310
$candy_dessert_sweets
FALSE TRUE
19975 700
$other
FALSE TRUE
20170 505
$no_use
FALSE TRUE
2798 17877
$ECIGT
FALSE TRUE
16809 3866
$ECIGAR
FALSE TRUE
17521 3154
$ESLT
FALSE TRUE
19338 1337
$EELCIGT
FALSE TRUE
16190 4485
$EHOOKAH
FALSE TRUE
18535 2140
$EROLLCIGTS
FALSE TRUE
19705 970
$EPIPE
FALSE TRUE
20208 467
$ESNUS
FALSE TRUE
20025 650
$EDISSOLV
FALSE TRUE
20456 219
$EBIDIS
FALSE TRUE
20491 184
$CCIGT
FALSE TRUE
19698 977
$CCIGAR
FALSE TRUE
19626 1049
$CSLT
FALSE TRUE
20149 526
$CELCIGT
FALSE TRUE
19161 1514
$CHOOKAH
FALSE TRUE
19942 733
$CROLLCIGTS
FALSE TRUE
20194 481
$CPIPE
FALSE TRUE
20461 214
$CSNUS
FALSE TRUE
20395 280
$CDISSOLV
FALSE TRUE
20543 132
$CBIDIS
FALSE TRUE
20578 97
$brand_ecig
NA's
20675
nyts_data[["nyts2017"]] <- nyts_data[["nyts2017"]] %>%
dplyr::select(psu,
finwgt,
stratum,
Q1, #Age
Q2, #Sex
Q3, #Grade
starts_with("Q4"), #Hispanic/Latino
starts_with("Q5"), #Race
starts_with("E",
ignore.case = FALSE),
starts_with("C",
ignore.case = FALSE),
CBIDIS,
Q50A, #Menthol # What flavors of tobacco products have you used in the past 30 days? (Select one or more)
Q50B, #Clove or spice
Q50C, #Fruit
Q50D, #Chocolate
Q50E, #Alcoholic Drink
Q50F, #Candy/Desserts/Other Sweets
Q50G, #Some Other Flavor Not Listed Here
Q50H #I Did Not Use Flavored Tobacco Products In the Past
) %>%
rename(Age=Q1,
female=Q2,
Grade=Q3,
Not_HL=Q4A,
HL_Mex=Q4B,
HL_PR=Q4C,
HL_Cub=Q4D,
HL_Other=Q4E,
Race_AIAN=Q5A,
Race_Asian=Q5B,
Race_BAA=Q5C,
Race_NHOPI=Q5D,
Race_White=Q5E,
female=Q2,
menthol=Q50A,
clove_spice=Q50B,
fruit=Q50C,
chocolate=Q50D,
alcoholic_drink=Q50E,
candy_dessert_sweets=Q50F,
other=Q50G,
no_use=Q50H) %>%
mutate(Age = as.numeric(Age) + 8,
Grade = as.numeric(Grade) + 5,
brand_ecig=NA) %>%
dplyr::select(-starts_with("Q"))
sapply(nyts_data[["nyts2017"]], function(x)
summary(
factor(x)
)
)
$psu
014595 058385 086452 086889 086972 087144 087174 087568 087858 088152 115262
354 165 296 240 268 188 314 318 93 129 278
129060 129751 142976 171594 173094 173711 174186 174258 186117 188113 188207
256 170 252 116 160 226 249 318 341 288 320
188307 243848 245033 258883 259591 259810 274380 301900 302266 314736 343581
421 134 148 140 274 167 189 188 309 370 213
343702 344106 344317 350305 373245 373427 374076 374456 387897 400362 401050
394 265 60 75 164 463 293 336 203 229 81
418326 487115 487123 501078 515682 515683 515792 515990 516100 516335 530582
193 182 37 240 257 68 208 364 172 189 379
558771 559447 559816 585762 586736 600815 602062 602173 602417 602425 644424
283 155 137 72 178 531 206 129 169 87 158
672182 674270 686434 686767 689716 690913 692424 692818 693010 701295 729632
205 174 138 32 276 185 421 217 34 168 285
730705 757723 758362 758663 772237
184 171 185 174 174
$finwgt
388.086140156 471.940845283 390.583989416 405.380567077 472.183232467
51 49 48 48 47
724.56606859 1784.368053098 518.253252285 787.40156861 1058.307376853
35 35 33 32 31
6505.08401827 666.989424614 759.980607023 855.933815842 480.026932681
31 30 30 30 29
848.614920471 926.022139243 2054.047484589 199.574079216 398.046267884
29 29 29 28 28
632.528237732 265.565422115 434.241886925 479.524141762 603.41343573
28 27 27 27 27
2481.307388658 206.462147383 316.796633448 460.22386269 697.047119656
27 26 26 26 26
807.931561134 881.176565371 1277.075266177 208.231781084 446.05788661
26 26 26 25 25
491.359940944 543.904772031 826.431573503 1666.670226291 2107.763960713
25 25 25 25 25
160.937199594 212.899945196 372.505372275 715.045700881 867.20325432
24 24 24 24 24
994.573293824 1270.103663994 1369.362294624 131.733679461 393.994795267
24 24 24 23 23
409.742815639 506.068428826 649.586475366 833.801586236 1053.241357521
23 23 23 23 23
1075.316452245 1097.264887598 1472.297231462 2471.826577818 6505.083867486
23 23 23 23 23
100.878347987 168.013153338 380.795649055 469.240664401 538.7376444
22 22 22 22 22
564.525712854 605.326863684 631.400184035 734.054217019 974.402999538
22 22 22 22 22
1041.12052098 1113.839139761 1157.153752424 1717.302420506 244.503033338
22 22 22 22 21
291.475998553 320.204350521 322.837800152 410.491377261 565.365433905
21 21 21 21 21
845.653652239 865.290461476 931.797436444 1054.095980076 1063.980316558
21 21 21 21 21
1280.057483708 1527.232038241 6491.921224713 384.116284763 532.124703938
21 21 21 20 20
549.714915274 657.596180463 966.440787959 1161.610230855 1197.989688589
20 20 20 20 20
1278.78119818 1499.591207108 1747.734538876 1816.850159172 (Other)
20 20 20 20 15360
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
1865 968 1087 1021 1205 930 1318 711 2493 249 707 323 1546 1654 697 1098
$Age
9 10 11 12 13 14 15 16 17 18 19 NA's
36 12 1018 2413 2495 2479 2704 2588 2525 1361 146 95
$female
1 2 NA's
8881 8815 176
$Grade
6 7 8 9 10 11 12 13 NA's
2524 2565 2473 2583 2637 2575 2391 25 99
$Not_HL
1 NA's
12696 5176
$HL_Mex
1 NA's
2190 15682
$HL_PR
1 NA's
527 17345
$HL_Cub
1 NA's
220 17652
$HL_Other
1 NA's
1970 15902
$Race_AIAN
1 NA's
1186 16686
$Race_Asian
1 NA's
1216 16656
$Race_BAA
1 NA's
4328 13544
$Race_NHOPI
1 NA's
526 17346
$Race_White
1 NA's
10478 7394
$menthol
1 NA's
748 17124
$clove_spice
1 NA's
89 17783
$fruit
1 NA's
1024 16848
$chocolate
1 NA's
203 17669
$alcoholic_drink
1 NA's
321 17551
$candy_dessert_sweets
1 NA's
620 17252
$other
1 NA's
434 17438
$no_use
1 NA's
15421 2451
$ECIGT
1 2 NA's
3107 14433 332
$ECIGAR
1 2 NA's
2495 14991 386
$ESLT
1 2 NA's
1151 16277 444
$EELCIGT
1 2 NA's
3695 13754 423
$EHOOKAH
1 2 NA's
1456 16003 413
$EROLLCIGTS
1 2 NA's
819 16517 536
$EPIPE
1 2 NA's
361 16975 536
$ESNUS
1 2 NA's
648 16688 536
$EDISSOLV
1 2 NA's
229 17107 536
$EBIDIS
1 2 NA's
232 17104 536
$CCIGT
1 2 NA's
973 16461 438
$CCIGAR
1 2 NA's
977 16439 456
$CSLT
1 2 NA's
510 16795 567
$CELCIGT
1 2 NA's
1360 16210 302
$CHOOKAH
1 2 NA's
508 16880 484
$CROLLCIGTS
1 2 NA's
369 16959 544
$CPIPE
1 2 NA's
137 17191 544
$CSNUS
1 2 NA's
249 17079 544
$CDISSOLV
1 2 NA's
105 17223 544
$CBIDIS
1 2 NA's
105 17223 544
$brand_ecig
NA's
17872
nyts_data[["nyts2017"]] <- nyts_data[["nyts2017"]] %>%
mutate_all(~ replace(., . %in% c("*", "**"), NA)) %>%
mutate(Age=as.character(Age),
Grade=as.character(Grade)
) %>%
mutate(Age=recode(Age,
`19` = ">18",
),
female=recode(female,
`1`= FALSE,
`2` = TRUE,
.default = NA,
.missing = NA),
Grade=recode(Grade,
`13` = "Ungraded/Other"),
Not_HL=recode(Not_HL,
`1` = TRUE,
.default = FALSE,
.missing = FALSE)) %>%
mutate_at(vars(starts_with("HL", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("Race", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("E", ignore.case = FALSE),
starts_with("C", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
`2` = FALSE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(menthol:no_use),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE)))
sapply(nyts_data[["nyts2017"]], function(x)
summary(
factor(x)
)
)
$psu
014595 058385 086452 086889 086972 087144 087174 087568 087858 088152 115262
354 165 296 240 268 188 314 318 93 129 278
129060 129751 142976 171594 173094 173711 174186 174258 186117 188113 188207
256 170 252 116 160 226 249 318 341 288 320
188307 243848 245033 258883 259591 259810 274380 301900 302266 314736 343581
421 134 148 140 274 167 189 188 309 370 213
343702 344106 344317 350305 373245 373427 374076 374456 387897 400362 401050
394 265 60 75 164 463 293 336 203 229 81
418326 487115 487123 501078 515682 515683 515792 515990 516100 516335 530582
193 182 37 240 257 68 208 364 172 189 379
558771 559447 559816 585762 586736 600815 602062 602173 602417 602425 644424
283 155 137 72 178 531 206 129 169 87 158
672182 674270 686434 686767 689716 690913 692424 692818 693010 701295 729632
205 174 138 32 276 185 421 217 34 168 285
730705 757723 758362 758663 772237
184 171 185 174 174
$finwgt
388.086140156 471.940845283 390.583989416 405.380567077 472.183232467
51 49 48 48 47
724.56606859 1784.368053098 518.253252285 787.40156861 1058.307376853
35 35 33 32 31
6505.08401827 666.989424614 759.980607023 855.933815842 480.026932681
31 30 30 30 29
848.614920471 926.022139243 2054.047484589 199.574079216 398.046267884
29 29 29 28 28
632.528237732 265.565422115 434.241886925 479.524141762 603.41343573
28 27 27 27 27
2481.307388658 206.462147383 316.796633448 460.22386269 697.047119656
27 26 26 26 26
807.931561134 881.176565371 1277.075266177 208.231781084 446.05788661
26 26 26 25 25
491.359940944 543.904772031 826.431573503 1666.670226291 2107.763960713
25 25 25 25 25
160.937199594 212.899945196 372.505372275 715.045700881 867.20325432
24 24 24 24 24
994.573293824 1270.103663994 1369.362294624 131.733679461 393.994795267
24 24 24 23 23
409.742815639 506.068428826 649.586475366 833.801586236 1053.241357521
23 23 23 23 23
1075.316452245 1097.264887598 1472.297231462 2471.826577818 6505.083867486
23 23 23 23 23
100.878347987 168.013153338 380.795649055 469.240664401 538.7376444
22 22 22 22 22
564.525712854 605.326863684 631.400184035 734.054217019 974.402999538
22 22 22 22 22
1041.12052098 1113.839139761 1157.153752424 1717.302420506 244.503033338
22 22 22 22 21
291.475998553 320.204350521 322.837800152 410.491377261 565.365433905
21 21 21 21 21
845.653652239 865.290461476 931.797436444 1054.095980076 1063.980316558
21 21 21 21 21
1280.057483708 1527.232038241 6491.921224713 384.116284763 532.124703938
21 21 21 20 20
549.714915274 657.596180463 966.440787959 1161.610230855 1197.989688589
20 20 20 20 20
1278.78119818 1499.591207108 1747.734538876 1816.850159172 (Other)
20 20 20 20 15360
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
1865 968 1087 1021 1205 930 1318 711 2493 249 707 323 1546 1654 697 1098
$Age
>18 10 11 12 13 14 15 16 17 18 9 NA's
146 12 1018 2413 2495 2479 2704 2588 2525 1361 36 95
$female
FALSE TRUE NA's
8881 8815 176
$Grade
10 11 12 6 7
2637 2575 2391 2524 2565
8 9 Ungraded/Other NA's
2473 2583 25 99
$Not_HL
FALSE TRUE
5176 12696
$HL_Mex
FALSE TRUE
15682 2190
$HL_PR
FALSE TRUE
17345 527
$HL_Cub
FALSE TRUE
17652 220
$HL_Other
FALSE TRUE
15902 1970
$Race_AIAN
FALSE TRUE
16686 1186
$Race_Asian
FALSE TRUE
16656 1216
$Race_BAA
FALSE TRUE
13544 4328
$Race_NHOPI
FALSE TRUE
17346 526
$Race_White
FALSE TRUE
7394 10478
$menthol
FALSE TRUE
17124 748
$clove_spice
FALSE TRUE
17783 89
$fruit
FALSE TRUE
16848 1024
$chocolate
FALSE TRUE
17669 203
$alcoholic_drink
FALSE TRUE
17551 321
$candy_dessert_sweets
FALSE TRUE
17252 620
$other
FALSE TRUE
17438 434
$no_use
FALSE TRUE
2451 15421
$ECIGT
FALSE TRUE
14765 3107
$ECIGAR
FALSE TRUE
15377 2495
$ESLT
FALSE TRUE
16721 1151
$EELCIGT
FALSE TRUE
14177 3695
$EHOOKAH
FALSE TRUE
16416 1456
$EROLLCIGTS
FALSE TRUE
17053 819
$EPIPE
FALSE TRUE
17511 361
$ESNUS
FALSE TRUE
17224 648
$EDISSOLV
FALSE TRUE
17643 229
$EBIDIS
FALSE TRUE
17640 232
$CCIGT
FALSE TRUE
16899 973
$CCIGAR
FALSE TRUE
16895 977
$CSLT
FALSE TRUE
17362 510
$CELCIGT
FALSE TRUE
16512 1360
$CHOOKAH
FALSE TRUE
17364 508
$CROLLCIGTS
FALSE TRUE
17503 369
$CPIPE
FALSE TRUE
17735 137
$CSNUS
FALSE TRUE
17623 249
$CDISSOLV
FALSE TRUE
17767 105
$CBIDIS
FALSE TRUE
17767 105
$brand_ecig
NA's
17872
nyts_data[["nyts2018"]] <- nyts_data[["nyts2018"]] %>%
dplyr::select(psu,
finwgt,
stratum,
Q1, #Age
Q2, #Sex
Q3, #Grade
starts_with("Q4"), #Hispanic/Latino
starts_with("Q5"), #Race
starts_with("E",
ignore.case = FALSE),
starts_with("C",
ignore.case = FALSE),
Q50A, #Menthol # What flavors of tobacco products have you used in the past 30 days? (Select one or more)
Q50B, #Clove or spice
Q50C, #Fruit
Q50D, #Chocolate
Q50E, #Alcoholic Drink
Q50F, #Candy/Desserts/Other Sweets
Q50G, #Some Other Flavor Not Listed Here
Q50H #I Did Not Use Flavored Tobacco Products In the Past
) %>%
rename(Age=Q1,
female=Q2,
Grade=Q3,
Not_HL=Q4A,
HL_Mex=Q4B,
HL_PR=Q4C,
HL_Cub=Q4D,
HL_Other=Q4E,
Race_AIAN=Q5A,
Race_Asian=Q5B,
Race_BAA=Q5C,
Race_NHOPI=Q5D,
Race_White=Q5E,
female=Q2,
menthol=Q50A,
clove_spice=Q50B,
fruit=Q50C,
chocolate=Q50D,
alcoholic_drink=Q50E,
candy_dessert_sweets=Q50F,
other=Q50G,
no_use=Q50H) %>%
mutate(Age = as.numeric(Age) + 8,
Grade = as.numeric(Grade) + 5,
brand_ecig=NA) %>%
dplyr::select(-starts_with("Q"))
sapply(nyts_data[["nyts2018"]], function(x)
summary(
factor(x)
)
)
$psu
015659 057544 058063 058279 058342 086286 086582 086634 086775 086958 086993
131 83 241 231 177 223 54 288 250 84 216
087009 087143 087205 087214 087537 088258 088304 143354 144110 172268 172362
238 133 222 187 183 270 72 372 307 214 249
172827 173483 173518 173614 187069 187695 188339 188792 188841 190174 243742
192 368 373 155 252 15 383 156 382 368 344
243772 244646 245531 245863 246106 258141 259259 259407 273856 303189 314614
171 148 320 300 116 84 86 148 61 274 264
315356 315841 316022 344472 357756 371868 372907 373105 374569 387227 388116
301 317 364 319 166 59 195 317 166 322 25
415354 415942 457785 458247 472607 486733 487266 500919 514921 516648 529004
134 64 213 182 103 78 166 83 64 165 284
529849 559574 559658 572256 600729 601533 601983 602020 603179 629054 644674
352 312 197 417 290 406 374 45 71 161 328
672288 673839 674805 686156 687050 687585 687958 688552 689044 689416 689634
274 277 320 119 126 90 144 303 264 86 305
690574 692282 700978 701250 736480 757540 759020
182 253 125 15 394 235 252
$finwgt
4990.707825052 372.106445056 374.223712424 438.895059192 512.773737505
73 54 53 53 50
4990.707824997 354.403367156 459.264157663 794.117545838 4990.707825184
46 38 38 35 35
261.594994077 604.212351194 464.262746508 526.352614715 243.614971982
34 34 33 31 30
716.756339454 1133.236763357 1063.013428506 499.309679476 725.642399133
30 30 29 28 28
955.117892997 533.302805442 878.385000967 884.736590151 615.101958781
28 27 27 27 26
656.112273243 763.304212486 772.024461398 804.949783275 436.289029717
26 26 26 26 25
1075.075363375 1116.00695267 1120.843771262 1208.191548298 1364.127973987
25 25 25 25 25
3176.705125185 359.909264221 501.302998165 639.387801493 672.915273738
25 24 24 24 24
750.014182644 768.617690322 772.265673267 872.656690614 925.421592037
24 24 24 24 24
925.454369278 934.553252225 997.238713858 1060.007709052 1921.985860852
24 24 24 24 24
4989.824123193 230.825021393 592.209826559 637.612536618 1173.734572865
24 23 23 23 23
1215.661901874 1397.810883406 1455.757503148 2086.599584044 4943.253945798
23 23 23 23 23
4965.403983968 358.261960805 610.908165514 643.867829284 662.274116541
23 22 22 22 22
755.668600945 792.397022445 890.114756698 1000.670065114 1121.902399257
22 22 22 22 22
1216.404436426 1484.57374707 1918.7838166 2132.519656006 285.715212581
22 22 22 22 21
435.458751085 488.084421785 502.351127283 546.319362206 601.212956081
21 21 21 21 21
635.885463139 662.109306082 753.224172586 757.829169717 809.249572869
21 21 21 21 21
847.008048039 966.525436209 1007.915531153 1060.586057955 1100.972041909
21 21 21 21 21
1167.285951387 1271.451496438 104.948041269 303.014353117 306.179881848
21 21 20 20 20
400.963911867 516.160638629 669.231249605 691.04417579 (Other)
20 20 20 20 17599
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
2346 1575 1170 621 1849 1114 548 742 2392 862 774 559 1731 1430 1160 1316
$Age
9 10 11 12 13 14 15 16 17 18 19 NA's
58 6 1007 2875 3013 2930 2881 2789 2719 1630 162 119
$female
1 2 NA's
10069 9920 200
$Grade
6 7 8 9 10 11 12 13 NA's
2903 3140 3012 2935 2664 2824 2568 16 127
$Not_HL
1 NA's
13766 6423
$HL_Mex
1 NA's
3065 17124
$HL_PR
1 NA's
657 19532
$HL_Cub
1 NA's
345 19844
$HL_Other
1 NA's
2102 18087
$Race_AIAN
1 NA's
1592 18597
$Race_Asian
1 NA's
1219 18970
$Race_BAA
1 NA's
3836 16353
$Race_NHOPI
1 NA's
577 19612
$Race_White
1 NA's
12624 7565
$menthol
1 NA's
1251 18938
$clove_spice
1 NA's
104 20085
$fruit
1 NA's
1789 18400
$chocolate
1 NA's
249 19940
$alcoholic_drink
1 NA's
364 19825
$candy_dessert_sweets
1 NA's
1138 19051
$other
1 NA's
755 19434
$no_use
1 NA's
16605 3584
$ECIGT
1 2 NA's
3559 16268 362
$ECIGAR
1 2 NA's
2876 16831 482
$ESLT
1 2 NA's
1444 18194 551
$EELCIGT
1 2 NA's
5071 14572 546
$EHOOKAH
1 2 NA's
1433 18239 517
$EROLLCIGTS
1 2 NA's
953 18513 723
$EPIPE
1 2 NA's
451 19015 723
$ESNUS
1 2 NA's
837 18629 723
$EDISSOLV
1 2 NA's
278 19188 723
$EBIDIS
1 2 NA's
274 19192 723
$CCIGT
1 2 NA's
1099 18578 512
$CCIGAR
1 2 NA's
1061 18601 527
$CSLT
1 2 NA's
623 18812 754
$CELCIGT
1 2 NA's
2703 17066 420
$CHOOKAH
1 2 NA's
564 18992 633
$CROLLCIGTS
1 2 NA's
433 19026 730
$CPIPE
1 2 NA's
175 19284 730
$CSNUS
1 2 NA's
332 19127 730
$CDISSOLV
1 2 NA's
112 19347 730
$CBIDIS
1 2 NA's
108 19351 730
$brand_ecig
NA's
20189
nyts_data[["nyts2018"]] <- nyts_data[["nyts2018"]] %>%
mutate_all(~ replace(., . %in% c("*", "**"), NA)) %>%
mutate(Age=as.character(Age),
Grade=as.character(Grade)
) %>%
mutate(Age=recode(Age,
`19` = ">18",
),
female=recode(female,
`1`= FALSE,
`2` = TRUE,
.default = NA,
.missing = NA),
Grade=recode(Grade,
`13` = "Ungraded/Other"),
Not_HL=recode(Not_HL,
`1` = TRUE,
.default = FALSE,
.missing = FALSE)) %>%
mutate_at(vars(starts_with("HL", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("Race", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("E", ignore.case = FALSE),
starts_with("C", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
`2` = FALSE,
.missing = NA))) %>%
mutate_at(vars(menthol:no_use),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE)))
sapply(nyts_data[["nyts2018"]], function(x)
summary(
factor(x)
)
)
$psu
015659 057544 058063 058279 058342 086286 086582 086634 086775 086958 086993
131 83 241 231 177 223 54 288 250 84 216
087009 087143 087205 087214 087537 088258 088304 143354 144110 172268 172362
238 133 222 187 183 270 72 372 307 214 249
172827 173483 173518 173614 187069 187695 188339 188792 188841 190174 243742
192 368 373 155 252 15 383 156 382 368 344
243772 244646 245531 245863 246106 258141 259259 259407 273856 303189 314614
171 148 320 300 116 84 86 148 61 274 264
315356 315841 316022 344472 357756 371868 372907 373105 374569 387227 388116
301 317 364 319 166 59 195 317 166 322 25
415354 415942 457785 458247 472607 486733 487266 500919 514921 516648 529004
134 64 213 182 103 78 166 83 64 165 284
529849 559574 559658 572256 600729 601533 601983 602020 603179 629054 644674
352 312 197 417 290 406 374 45 71 161 328
672288 673839 674805 686156 687050 687585 687958 688552 689044 689416 689634
274 277 320 119 126 90 144 303 264 86 305
690574 692282 700978 701250 736480 757540 759020
182 253 125 15 394 235 252
$finwgt
4990.707825052 372.106445056 374.223712424 438.895059192 512.773737505
73 54 53 53 50
4990.707824997 354.403367156 459.264157663 794.117545838 4990.707825184
46 38 38 35 35
261.594994077 604.212351194 464.262746508 526.352614715 243.614971982
34 34 33 31 30
716.756339454 1133.236763357 1063.013428506 499.309679476 725.642399133
30 30 29 28 28
955.117892997 533.302805442 878.385000967 884.736590151 615.101958781
28 27 27 27 26
656.112273243 763.304212486 772.024461398 804.949783275 436.289029717
26 26 26 26 25
1075.075363375 1116.00695267 1120.843771262 1208.191548298 1364.127973987
25 25 25 25 25
3176.705125185 359.909264221 501.302998165 639.387801493 672.915273738
25 24 24 24 24
750.014182644 768.617690322 772.265673267 872.656690614 925.421592037
24 24 24 24 24
925.454369278 934.553252225 997.238713858 1060.007709052 1921.985860852
24 24 24 24 24
4989.824123193 230.825021393 592.209826559 637.612536618 1173.734572865
24 23 23 23 23
1215.661901874 1397.810883406 1455.757503148 2086.599584044 4943.253945798
23 23 23 23 23
4965.403983968 358.261960805 610.908165514 643.867829284 662.274116541
23 22 22 22 22
755.668600945 792.397022445 890.114756698 1000.670065114 1121.902399257
22 22 22 22 22
1216.404436426 1484.57374707 1918.7838166 2132.519656006 285.715212581
22 22 22 22 21
435.458751085 488.084421785 502.351127283 546.319362206 601.212956081
21 21 21 21 21
635.885463139 662.109306082 753.224172586 757.829169717 809.249572869
21 21 21 21 21
847.008048039 966.525436209 1007.915531153 1060.586057955 1100.972041909
21 21 21 21 21
1167.285951387 1271.451496438 104.948041269 303.014353117 306.179881848
21 21 20 20 20
400.963911867 516.160638629 669.231249605 691.04417579 (Other)
20 20 20 20 17599
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
2346 1575 1170 621 1849 1114 548 742 2392 862 774 559 1731 1430 1160 1316
$Age
>18 10 11 12 13 14 15 16 17 18 9 NA's
162 6 1007 2875 3013 2930 2881 2789 2719 1630 58 119
$female
FALSE TRUE NA's
10069 9920 200
$Grade
10 11 12 6 7
2664 2824 2568 2903 3140
8 9 Ungraded/Other NA's
3012 2935 16 127
$Not_HL
FALSE TRUE
6423 13766
$HL_Mex
FALSE TRUE
17124 3065
$HL_PR
FALSE TRUE
19532 657
$HL_Cub
FALSE TRUE
19844 345
$HL_Other
FALSE TRUE
18087 2102
$Race_AIAN
FALSE TRUE
18597 1592
$Race_Asian
FALSE TRUE
18970 1219
$Race_BAA
FALSE TRUE
16353 3836
$Race_NHOPI
FALSE TRUE
19612 577
$Race_White
FALSE TRUE
7565 12624
$menthol
FALSE TRUE
18938 1251
$clove_spice
FALSE TRUE
20085 104
$fruit
FALSE TRUE
18400 1789
$chocolate
FALSE TRUE
19940 249
$alcoholic_drink
FALSE TRUE
19825 364
$candy_dessert_sweets
FALSE TRUE
19051 1138
$other
FALSE TRUE
19434 755
$no_use
FALSE TRUE
3584 16605
$ECIGT
FALSE TRUE NA's
16268 3559 362
$ECIGAR
FALSE TRUE NA's
16831 2876 482
$ESLT
FALSE TRUE NA's
18194 1444 551
$EELCIGT
FALSE TRUE NA's
14572 5071 546
$EHOOKAH
FALSE TRUE NA's
18239 1433 517
$EROLLCIGTS
FALSE TRUE NA's
18513 953 723
$EPIPE
FALSE TRUE NA's
19015 451 723
$ESNUS
FALSE TRUE NA's
18629 837 723
$EDISSOLV
FALSE TRUE NA's
19188 278 723
$EBIDIS
FALSE TRUE NA's
19192 274 723
$CCIGT
FALSE TRUE NA's
18578 1099 512
$CCIGAR
FALSE TRUE NA's
18601 1061 527
$CSLT
FALSE TRUE NA's
18812 623 754
$CELCIGT
FALSE TRUE NA's
17066 2703 420
$CHOOKAH
FALSE TRUE NA's
18992 564 633
$CROLLCIGTS
FALSE TRUE NA's
19026 433 730
$CPIPE
FALSE TRUE NA's
19284 175 730
$CSNUS
FALSE TRUE NA's
19127 332 730
$CDISSOLV
FALSE TRUE NA's
19347 112 730
$CBIDIS
FALSE TRUE NA's
19351 108 730
$brand_ecig
NA's
20189
nyts_data[["nyts2019"]] <- nyts_data[["nyts2019"]] %>%
dplyr::select(psu,
finwgt,
stratum,
Q1, #Age
Q2, #Sex
Q3, #Grade
starts_with("Q4"), #Hispanic/Latino
starts_with("Q5"), #Race
starts_with("E",
ignore.case = FALSE),
starts_with("C",
ignore.case = FALSE),
-EHTP,
-CHTP,
Q40, #Brang, e-cigarettes
Q62A, #Menthol # What flavors of tobacco products have you used in the past 30 days? (Select one or more)
Q62B, #Clove or spice
Q62C, #Fruit
Q62D, #Chocolate
Q62E, #Alcoholic Drink
Q62F, #Candy/Desserts/Other Sweets
Q62G, #Some Other Flavor Not Listed Here
) %>%
rename(brand_ecig=Q40,
Age=Q1,
female=Q2,
Grade=Q3,
Not_HL=Q4A,
HL_Mex=Q4B,
HL_PR=Q4C,
HL_Cub=Q4D,
HL_Other=Q4E,
Race_AIAN=Q5A,
Race_Asian=Q5B,
Race_BAA=Q5C,
Race_NHOPI=Q5D,
Race_White=Q5E,
female=Q2,
menthol=Q62A,
clove_spice=Q62B,
fruit=Q62C,
chocolate=Q62D,
alcoholic_drink=Q62E,
candy_dessert_sweets=Q62F,
other=Q62G) %>%
mutate(Age = as.numeric(Age) + 8,
Grade = as.numeric(Grade) + 5,
no_use="missing") %>%
dplyr::select(-starts_with("Q"))
sapply(nyts_data[["nyts2019"]], function(x)
summary(
factor(x)
)
)
$psu
58123 73728 73914 86357 86380 86698 86869 86877 86997 87107 87479
291 167 171 205 262 94 178 346 220 71 222
87601 87669 87860 87876 88243 171990 172758 173174 173515 173535 173649
184 198 240 187 162 271 305 68 337 186 204
186909 187981 229278 243490 243700 244840 258416 259834 274204 287241 300785
133 345 380 480 114 160 146 134 264 134 316
300814 303802 316013 358608 373709 374512 374814 386930 387529 401006 401530
331 249 367 41 433 191 268 422 362 279 170
415984 416340 416550 417008 445315 486486 487128 487177 487457 487518 501192
282 92 133 218 247 286 305 312 91 167 189
514427 515669 516003 516819 516849 529165 529557 530666 531454 543901 559013
125 84 268 145 227 219 104 140 267 304 267
559459 586535 601420 601577 601913 602241 602677 674314 686520 688517 688727
313 150 286 328 24 384 112 126 165 51 136
688871 689471 689962 690649 690720 693247 701384 729538 729920 732232 757899
137 199 147 236 146 117 203 138 100 164 298
758808 758911 800237
146 92 60
$finwgt
298.94381695 1349.5698631 546.11348506 691.07608343 5285.5332095 456.58921394
35 34 33 33 33 30
1814.6246166 676.96068381 745.55326355 876.04021216 1592.6392583 1162.7807537
30 29 29 29 29 28
188.96218054 436.15905944 878.15523472 1110.4917206 305.78828093 316.2159641
27 27 27 27 26 26
511.1744348 646.15466161 690.19319279 1154.5213819 1159.6037522 1405.2169869
26 26 26 26 26 26
674.64725539 825.52309574 884.6807423 925.71486779 1164.6450091 1362.316235
25 25 25 25 25 25
558.25390758 625.53648288 839.6866944 882.78302229 886.20209942 1338.2350647
24 24 24 24 24 24
1772.9717327 225.52526803 792.71025137 911.95033723 956.70266731 353.79114524
24 23 23 23 23 22
507.50355235 739.96695295 775.05061994 887.67803637 1111.0008494 1194.6677527
22 22 22 22 22 22
1278.4328612 1363.8639539 1642.2200913 11.150042919 16.065197906 172.15949442
22 22 22 21 21 21
414.949031 710.93532098 780.25920379 1023.8115393 1203.6836641 1444.3893222
21 21 21 21 21 21
4411.7913281 178.47168745 566.73417786 631.63868903 670.49736758 728.77064723
21 20 20 20 20 20
741.08110309 765.27178212 790.13593556 864.21130384 876.30041914 934.24093605
20 20 20 20 20 20
1114.3023069 1179.018274 1232.8285309 1260.744969 1601.8637426 1756.8757857
20 20 20 20 20 20
5183.3811612 5268.5549579 78.116704202 436.74312217 679.42299971 940.82420216
20 20 19 19 19 19
963.51307711 1210.2995777 1366.7316106 1369.8132126 1403.0995315 1453.5670628
19 19 19 19 19 19
1952.421273 350.36503801 512.19207166 557.49460422 623.97616918 653.51170585
19 18 18 18 18 18
697.41131479 751.91370328 799.96587077 (Other)
18 18 18 16757
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
2024 716 843 226 2664 1202 268 369 2958 714 665 688 2553 1001 917 1210
$Age
9 10 11 12 13 14 15 16 17 18 19 NA's
35 19 1108 2789 3078 2810 2593 2523 2527 1376 122 38
$female
.N 1 2
116 9803 9099
$Grade
6 7 8 9 10 11 12 13 NA's
2944 3024 2869 2790 2499 2502 2306 27 57
$Not_HL
.N .Z 1 NA's
334 2 13118 5564
$HL_Mex
.N .Z 1 NA's
334 2 3060 15622
$HL_PR
.N .Z 1 NA's
334 2 536 18146
$HL_Cub
.N .Z 1 NA's
334 2 213 18469
$HL_Other
.N .Z 1 NA's
334 2 2141 16541
$brand_ecig
.N .S .Z 1 2 3 4 5 6 7 8
60 15340 14 528 111 2028 36 32 44 100 725
$Race_AIAN
.N .Z 1 NA's
1161 2 1536 16319
$Race_Asian
.N .Z 1 NA's
1161 2 1443 16412
$Race_BAA
.N .Z 1 NA's
1161 2 3675 14180
$Race_NHOPI
.N .Z 1 NA's
1161 2 666 17189
$Race_White
.N .Z 1 NA's
1161 2 12291 5564
$ECIGT
1 2 M
2931 16061 26
$ECIGAR
1 2 M
2541 16441 36
$ESLT
1 2 M
1270 17704 44
$EELCIGT
1 2 M
6409 12563 46
$EHOOKAH
1 2 M
1289 17675 54
$EROLLCIGTS
1 2 M
832 18005 181
$EPIPE
1 2 M
489 18336 193
$ESNUS
1 2 M
616 18209 193
$EDISSOLV
1 2 M
244 18583 191
$EBIDIS
1 2 M
221 18605 192
$CCIGT
1 2 M
748 18227 43
$CCIGAR
1 2 M
930 18028 60
$CSLT
1 2 M
531 18441 46
$CELCIGT
1 2 M
3628 15286 104
$CHOOKAH
1 2 M
477 18471 70
$CROLLCIGTS
1 2 M
325 18508 185
$CPIPE
1 2 M
138 18683 197
$CSNUS
1 2 M
205 18624 189
$CDISSOLV
1 2 M
74 18758 186
$CBIDIS
1 2 M
71 18773 174
$menthol
.N .S .Z 1 NA's
79 15910 22 1617 1390
$clove_spice
.N .S .Z 1 NA's
79 15910 22 88 2919
$fruit
.N .S .Z 1 NA's
79 15910 22 1887 1120
$chocolate
.N .S .Z 1 NA's
79 15910 22 197 2810
$alcoholic_drink
.N .S .Z 1 NA's
79 15910 22 249 2758
$candy_dessert_sweets
.N .S .Z 1 NA's
79 15910 22 1108 1899
$other
.N .S .Z 1 NA's
79 15910 22 385 2622
$no_use
missing
19018
nyts_data[["nyts2019"]] <- nyts_data[["nyts2019"]] %>%
mutate_all(~ replace(., . %in% c(".N",".S",".Z"), NA)) %>%
mutate(Age=as.character(Age),
Grade=as.character(Grade)
) %>%
mutate(psu=as.character(psu),
Age=recode(Age,
`19` = ">18",
),
female=recode(female,
`1`= FALSE,
`2` = TRUE,
.default = NA),
Grade=recode(Grade,
`13` = "Ungraded/Other"),
Not_HL=recode(Not_HL,
`1` = TRUE,
.default = FALSE,
.missing = FALSE)) %>%
mutate_at(vars(starts_with("HL", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("Race", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing = FALSE))) %>%
mutate_at(vars(starts_with("E", ignore.case = FALSE),
starts_with("C", ignore.case = FALSE)),
list(~recode(.,
`1` = TRUE,
`2` = FALSE,
.default = NA))) %>%
mutate(brand_ecig = recode(brand_ecig,
`1` = "Other", #levels 1,8 combined to `Other`
`2` = "Blu",
`3` = "JUUL",
`4` = "Logic",
`5` = "MarkTen",
`6` = "NJOY",
`7` = "Vuse",
`8` = "Other")) %>%
mutate_at(vars(menthol:no_use),
list(~recode(.,
`1` = TRUE,
.default = FALSE,
.missing =FALSE))) #Ask Michael about this if unclear
sapply(nyts_data[["nyts2019"]], function(x)
summary(
factor(x)
)
)
$psu
171990 172758 173174 173515 173535 173649 186909 187981 229278 243490 243700
271 305 68 337 186 204 133 345 380 480 114
244840 258416 259834 274204 287241 300785 300814 303802 316013 358608 373709
160 146 134 264 134 316 331 249 367 41 433
374512 374814 386930 387529 401006 401530 415984 416340 416550 417008 445315
191 268 422 362 279 170 282 92 133 218 247
486486 487128 487177 487457 487518 501192 514427 515669 516003 516819 516849
286 305 312 91 167 189 125 84 268 145 227
529165 529557 530666 531454 543901 559013 559459 58123 586535 601420 601577
219 104 140 267 304 267 313 291 150 286 328
601913 602241 602677 674314 686520 688517 688727 688871 689471 689962 690649
24 384 112 126 165 51 136 137 199 147 236
690720 693247 701384 729538 729920 732232 73728 73914 757899 758808 758911
146 117 203 138 100 164 167 171 298 146 92
800237 86357 86380 86698 86869 86877 86997 87107 87479 87601 87669
60 205 262 94 178 346 220 71 222 184 198
87860 87876 88243
240 187 162
$finwgt
298.94381695 1349.5698631 546.11348506 691.07608343 5285.5332095 456.58921394
35 34 33 33 33 30
1814.6246166 676.96068381 745.55326355 876.04021216 1592.6392583 1162.7807537
30 29 29 29 29 28
188.96218054 436.15905944 878.15523472 1110.4917206 305.78828093 316.2159641
27 27 27 27 26 26
511.1744348 646.15466161 690.19319279 1154.5213819 1159.6037522 1405.2169869
26 26 26 26 26 26
674.64725539 825.52309574 884.6807423 925.71486779 1164.6450091 1362.316235
25 25 25 25 25 25
558.25390758 625.53648288 839.6866944 882.78302229 886.20209942 1338.2350647
24 24 24 24 24 24
1772.9717327 225.52526803 792.71025137 911.95033723 956.70266731 353.79114524
24 23 23 23 23 22
507.50355235 739.96695295 775.05061994 887.67803637 1111.0008494 1194.6677527
22 22 22 22 22 22
1278.4328612 1363.8639539 1642.2200913 11.150042919 16.065197906 172.15949442
22 22 22 21 21 21
414.949031 710.93532098 780.25920379 1023.8115393 1203.6836641 1444.3893222
21 21 21 21 21 21
4411.7913281 178.47168745 566.73417786 631.63868903 670.49736758 728.77064723
21 20 20 20 20 20
741.08110309 765.27178212 790.13593556 864.21130384 876.30041914 934.24093605
20 20 20 20 20 20
1114.3023069 1179.018274 1232.8285309 1260.744969 1601.8637426 1756.8757857
20 20 20 20 20 20
5183.3811612 5268.5549579 78.116704202 436.74312217 679.42299971 940.82420216
20 20 19 19 19 19
963.51307711 1210.2995777 1366.7316106 1369.8132126 1403.0995315 1453.5670628
19 19 19 19 19 19
1952.421273 350.36503801 512.19207166 557.49460422 623.97616918 653.51170585
19 18 18 18 18 18
697.41131479 751.91370328 799.96587077 (Other)
18 18 18 16757
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1 HU2 HU3 HU4
2024 716 843 226 2664 1202 268 369 2958 714 665 688 2553 1001 917 1210
$Age
>18 10 11 12 13 14 15 16 17 18 9 NA's
122 19 1108 2789 3078 2810 2593 2523 2527 1376 35 38
$female
FALSE TRUE NA's
9803 9099 116
$Grade
10 11 12 6 7
2499 2502 2306 2944 3024
8 9 Ungraded/Other NA's
2869 2790 27 57
$Not_HL
FALSE TRUE
5900 13118
$HL_Mex
FALSE TRUE
15958 3060
$HL_PR
FALSE TRUE
18482 536
$HL_Cub
FALSE TRUE
18805 213
$HL_Other
FALSE TRUE
16877 2141
$brand_ecig
Blu JUUL Logic MarkTen NJOY Other Vuse NA's
111 2028 36 32 44 1253 100 15414
$Race_AIAN
FALSE TRUE
17482 1536
$Race_Asian
FALSE TRUE
17575 1443
$Race_BAA
FALSE TRUE
15343 3675
$Race_NHOPI
FALSE TRUE
18352 666
$Race_White
FALSE TRUE
6727 12291
$ECIGT
FALSE TRUE NA's
16061 2931 26
$ECIGAR
FALSE TRUE NA's
16441 2541 36
$ESLT
FALSE TRUE NA's
17704 1270 44
$EELCIGT
FALSE TRUE NA's
12563 6409 46
$EHOOKAH
FALSE TRUE NA's
17675 1289 54
$EROLLCIGTS
FALSE TRUE NA's
18005 832 181
$EPIPE
FALSE TRUE NA's
18336 489 193
$ESNUS
FALSE TRUE NA's
18209 616 193
$EDISSOLV
FALSE TRUE NA's
18583 244 191
$EBIDIS
FALSE TRUE NA's
18605 221 192
$CCIGT
FALSE TRUE NA's
18227 748 43
$CCIGAR
FALSE TRUE NA's
18028 930 60
$CSLT
FALSE TRUE NA's
18441 531 46
$CELCIGT
FALSE TRUE NA's
15286 3628 104
$CHOOKAH
FALSE TRUE NA's
18471 477 70
$CROLLCIGTS
FALSE TRUE NA's
18508 325 185
$CPIPE
FALSE TRUE NA's
18683 138 197
$CSNUS
FALSE TRUE NA's
18624 205 189
$CDISSOLV
FALSE TRUE NA's
18758 74 186
$CBIDIS
FALSE TRUE NA's
18773 71 174
$menthol
FALSE TRUE
17401 1617
$clove_spice
FALSE TRUE
18930 88
$fruit
FALSE TRUE
17131 1887
$chocolate
FALSE TRUE
18821 197
$alcoholic_drink
FALSE TRUE
18769 249
$candy_dessert_sweets
FALSE TRUE
17910 1108
$other
FALSE TRUE
18633 385
$no_use
FALSE
19018
year psu finwgt
"numeric" "character" "numeric"
stratum Age female
"character" "character" "logical"
Grade Not_HL HL_Mex
"character" "logical" "logical"
HL_PR HL_Cub HL_Other
"logical" "logical" "logical"
Race_AIAN Race_Asian Race_BAA
"logical" "logical" "logical"
Race_NHOPI Race_White ECIGT
"logical" "logical" "logical"
ECIGAR ESLT EELCIGT
"logical" "logical" "logical"
EROLLCIGTS EBIDIS EHOOKAH
"logical" "logical" "logical"
EPIPE ESNUS EDISSOLV
"logical" "logical" "logical"
CCIGT CCIGAR CSLT
"logical" "logical" "logical"
CELCIGT CROLLCIGTS CBIDIS
"logical" "logical" "logical"
CHOOKAH CPIPE CSNUS
"logical" "logical" "logical"
CDISSOLV brand_ecig menthol
"logical" "character" "logical"
clove_spice fruit chocolate
"logical" "logical" "logical"
alcoholic_drink candy_dessert_sweets other
"logical" "logical" "logical"
no_use
"logical"
$year
2015 2016 2017 2018 2019
17711 20675 17872 20189 19018
$psu
187822 600815 373302 243490 086878 087664 173584 373427 458137 515814
565 531 501 480 479 470 469 463 452 450
087896 687909 374028 373709 386930 087843 188307 692424 572256 731503
437 436 435 433 422 421 421 421 417 414
601533 372861 087656 343702 736480 602241 188339 188841 229278 187681
406 401 397 394 394 384 383 382 380 379
530582 601983 173518 758261 758520 143354 416045 314736 188489 173483
379 374 373 373 373 372 371 370 369 368
190174 689327 316013 372465 316022 515990 087614 387529 014595 644656
368 368 367 367 364 364 363 362 354 354
529849 258711 344194 086754 86877 187981 245271 243742 514830 186117
352 350 348 347 346 345 345 344 344 341
173515 087425 300946 374456 529391 172374 300814 559658 572477 601577
337 336 336 336 333 331 331 331 328 328
644674 058470 314939 173458 387227 188207 245531 486665 674805 344472
328 325 323 322 322 320 320 320 320 319
087568 174258 486124 315841 373105 300785 074170 087174 015438 559459
318 318 318 317 317 316 314 314 313 313
730385 487177 559574 302266 400915 560847 087003 673286 144110 (Other)
313 312 312 309 309 309 308 308 307 59142
$finwgt
6084.762382383 4990.707825052 6084.749363267 372.106445056 374.223712424
90 73 61 54 53
438.895059192 871.325553937 388.086140156 512.773737505 6084.748763328
53 52 51 50 50
471.940845283 390.583989416 393.890426751 405.380567077 641.647375466
49 48 48 48 48
472.183232467 1462.436434424 4990.707824997 593.037596627 895.030720016
47 47 46 45 44
1294.137423906 1438.420759833 480.328096721 354.403367156 459.264157663
44 44 39 38 38
342.509547149 934.989137039 1836.652739308 460.564361052 702.57430816
37 37 37 36 36
298.94381695 645.096986799 688.756981919 724.56606859 794.117545838
35 35 35 35 35
1784.368053098 4990.707825184 261.594994077 376.209171932 604.212351194
35 35 34 34 34
1349.5698631 6084.747889789 464.262746508 518.253252285 546.11348506
34 34 33 33 33
577.454052555 651.46204257 691.07608343 929.843069043 967.677487198
33 33 33 33 33
5285.5332095 452.180288822 541.333365673 729.816382606 787.40156861
33 32 32 32 32
835.705455892 888.382540193 927.94099198 321.964869964 348.981595173
32 32 32 31 31
473.352544161 526.352614715 688.65484377 851.768379729 868.130099018
31 31 31 31 31
894.645660874 903.144043691 984.845596021 1058.307376853 6505.08401827
31 31 31 31 31
243.614971982 456.58921394 550.786275093 565.667360783 666.989424614
30 30 30 30 30
701.063606043 716.756339454 759.980607023 793.263666402 855.933815842
30 30 30 30 30
1133.236763357 1814.6246166 376.294559675 409.581862696 480.026932681
30 30 29 29 29
543.10044387 655.970957179 676.96068381 745.55326355 801.149846011
29 29 29 29 29
848.614920471 876.04021216 926.022139243 946.819967478 1015.462088582
29 29 29 29 29
1016.149108108 1019.981866234 1040.468408082 1063.013428506 (Other)
29 29 29 29 91861
$stratum
BR1 BR2 BR3 BR4 BU1 BU2 BU3 BU4 HR1 HR2 HR3 HR4 HU1
10080 5864 4798 2886 9212 4851 3221 2741 13570 2932 3025 2189 9732
HU2 HU3 HU4
7945 5548 6871
$Age
>18 10 11 12 13 14 15 16 17 18 9 NA's
727 50 5360 13499 14613 14036 13498 13205 12754 7108 198 417
$female
FALSE TRUE NA's
48149 46538 778
$Grade
10 11 12 6 7
13118 12857 12068 14158 14823
8 9 Ungraded/Other NA's
14301 13561 102 477
$Not_HL
FALSE TRUE
29372 66093
$HL_Mex
FALSE TRUE
81323 14142
$HL_PR
FALSE TRUE
92477 2988
$HL_Cub
FALSE TRUE
94236 1229
$HL_Other
FALSE TRUE
85451 10014
$Race_AIAN
FALSE TRUE
88247 7218
$Race_Asian
FALSE TRUE
88997 6468
$Race_BAA
FALSE TRUE
75419 20046
$Race_NHOPI
FALSE TRUE
92515 2950
$Race_White
FALSE TRUE
37558 57907
$ECIGT
FALSE TRUE NA's
77584 17176 705
$ECIGAR
FALSE TRUE NA's
80549 13984 932
$ESLT
FALSE TRUE NA's
87950 6562 953
$EELCIGT
FALSE TRUE NA's
70229 24333 903
$EROLLCIGTS
FALSE TRUE NA's
89410 4436 1619
$EBIDIS
FALSE TRUE NA's
92679 1156 1630
$EHOOKAH
FALSE TRUE NA's
85617 8562 1286
$EPIPE
FALSE TRUE NA's
91658 2176 1631
$ESNUS
FALSE TRUE NA's
90689 3145 1631
$EDISSOLV
FALSE TRUE NA's
92733 1103 1629
$CCIGT
FALSE TRUE NA's
89668 4878 919
$CCIGAR
FALSE TRUE NA's
89312 5023 1130
$CSLT
FALSE TRUE NA's
91541 2796 1128
$CELCIGT
FALSE TRUE NA's
83510 11161 794
$CROLLCIGTS
FALSE TRUE NA's
91807 1976 1682
$CBIDIS
FALSE TRUE NA's
93323 471 1671
$CHOOKAH
FALSE TRUE NA's
90853 3142 1470
$CPIPE
FALSE TRUE NA's
92970 801 1694
$CSNUS
FALSE TRUE NA's
92565 1214 1686
$CDISSOLV
FALSE TRUE NA's
93305 477 1683
$brand_ecig
Blu JUUL Logic MarkTen NJOY Other Vuse NA's
111 2028 36 32 44 1253 100 91861
$menthol
FALSE TRUE NA's
73305 4449 17711
$clove_spice
FALSE TRUE NA's
77360 394 17711
$fruit
FALSE TRUE NA's
71945 5809 17711
$chocolate
FALSE TRUE NA's
76875 879 17711
$alcoholic_drink
FALSE TRUE NA's
76510 1244 17711
$candy_dessert_sweets
FALSE TRUE NA's
74188 3566 17711
$other
FALSE TRUE NA's
75675 2079 17711
$no_use
FALSE TRUE NA's
27851 49903 17711
Reminder: Current users are a subset of ever users.
LS0tCnRpdGxlOiAiT3BlbiBDYXNlIFN0dWRpZXMgOiBWYXBpbmcgQmVoYXZpb3JzIGluIEFtZXJpY2FuIFlvdXRoIgphdXRob3I6ICJNaWNoYWVsIE9udGl2ZXJvcywgQ2FycmllIFdyaWdodCwgUGhELiAiCgpjc3M6IHN0eWxlLmNzcwpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHNlbGZfY29udGFpbmVkOiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwoKLS0tCjxzdHlsZT4KI1RPQyB7CiAgYmFja2dyb3VuZDogdXJsKCJodHRwczovL29wZW5jYXNlc3R1ZGllcy5naXRodWIuaW8vaW1nL2xvZ28uanBnIik7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIHBhZGRpbmctdG9wOiAyNDBweCAhaW1wb3J0YW50OwogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KPC9zdHlsZT4KCmBgYHtyLCBlY2hvPUZBTFNFfQprbml0X3RpbWVfc3RhcnQgPC0gU3lzLnRpbWUoKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTgsIGRwaT0zMDApIApgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoaW5jbHVkZSA9IFRSVUUsIGNvbW1lbnQgPSBOQSwgZWNobyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAnOTAlJykKbGlicmFyeShoZXJlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCgojIyMjIHsub3V0bGluZSB9CmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI4MDAgcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAiZmluYWxfcGxvdC5wbmciKSkKYGBgCiMjIyMKCgojIyB7LmRpc2NsYWltZXJfYmxvY2t9CgoqKkRpc2NsYWltZXIqKjogVGhlIHB1cnBvc2Ugb2YgdGhlIFtPcGVuIENhc2UgU3R1ZGllc10oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvKXt0YXJnZXQ9Il9ibGFuayJ9IHByb2plY3QgaXMgKip0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgZGF0YSBzY2llbmNlIG1ldGhvZHMsIHRvb2xzLCBhbmQgc29mdHdhcmUgaW4gdGhlIGNvbnRleHQgb2YgbWVzc3ksIHJlYWwtd29ybGQgZGF0YSoqLiBBIGdpdmVuIGNhc2Ugc3R1ZHkgZG9lcyBub3QgY292ZXIgYWxsIGFzcGVjdHMgb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MsIGlzIG5vdCBjbGFpbWluZyB0byBiZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3YXkgdG8gYW5hbHl6ZSBhIGdpdmVuIGRhdGEgc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIG1ha2luZyBwb2xpY3kgZGVjaXNpb25zIHdpdGhvdXQgZXh0ZXJuYWwgY29uc3VsdGF0aW9uIGZyb20gc2NpZW50aWZpYyBleHBlcnRzLiAKCiMjICoqTW90aXZhdGlvbioqCioqKiAKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpZYW5vc2t5LCBKLiBELiBldCBhbC4gU3BhdGlvLXRlbXBvcmFsIG1vZGVsaW5nIG9mIHBhcnRpY3VsYXRlIGFpciBwb2xsdXRpb24gaW4gdGhlIGNvbnRlcm1pbm91cyBVbml0ZWQgU3RhdGVzIHVzaW5nIGdlb2dyYXBoaWMgYW5kIG1ldGVvcm9sb2dpY2FsIHByZWRpY3RvcnMuICpFbnZpcm9uIEhlYWx0aCogMTMsIDYzICgyMDE0KS4KLSBbQXJ0aWNsZSBpbiBGcm9udGllcnMgb2YgUGhhcm1hY29sb2d5XShodHRwczovL3d3dy5mcm9udGllcnNpbi5vcmcvYXJ0aWNsZXMvMTAuMzM4OS9mcGhhci4yMDE5LjAxNjE5L2Z1bGwpCgotIFtNb3JiaWRpdHkgYW5kIE1vcnRhbGl0eSBXZWVrbHkgUmVwb3J0XShodHRwczovL3d3dy5jZGMuZ292L21td3Ivdm9sdW1lcy82OC93ci9tbTY4MDZlMS5odG0/c19jaWQ9bW02ODA2ZTFfdykKCi0gW1N0YXRpc3RhIFZpc3VhbGl6YXRpb25dKGh0dHBzOi8vd3d3LnN0YXRpc3RhLmNvbS9zdGF0aXN0aWNzLzg4MTgzNy92YXBpbmctYW5kLWVsZWN0cm9uaWMtY2lnYXJldHRlLXVzZS11cy1ieS1nZW5kZXIvKQoKCiMjIyMKCgojIyAqKk1haW4gUXVlc3Rpb25zKioKKioqIAoKIyMjIyB7Lm1haW5fcXVlc3Rpb25fYmxvY2t9CjxiPjx1PiBPdXIgbWFpbiBxdWVzdGlvbjogPC91PjwvYj4KCjEpIEhvdyBoYXMgdG9iYWNjby9uaWNvdGluZSB1c2UgYnkgQW1lcmljYW4geW91dGggY2hhbmdlZCBzaW5jZSAyMDE1PyAKMikgSG93IGRvIHZhcGluZyByYXRlcyBjb21wYXJlIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXM/CjMpIFdoYXQgdmFwaW5nIGJyYW5kcyBhbmQgZmxhdm9ycyBhcHBlYXIgdG8gYmUgdXNlZCB0aGUgbW9zdCBmcmVxdWVudGx5PwogICAgKyBEdXJpbmcgdGhlIHBhc3QgMzAgZGF5cywgd2hhdCBicmFuZCBvZiBlLWNpZ2FyZXR0ZXMgZGlkIHlvdSB1c3VhbGx5IHVzZT8KNCkgSGF2ZSB2YXBpbmcgcmF0ZXMgcG9zc2libHkgaW5mbHVlbmNlZCB0b2JhY2NvL25pY290aW5lIHVzZT8KCiMjIyMKCgojIyAqKkxlYXJuaW5nIE9iamVjdGl2ZXMqKiAKKioqIAoKSW4gdGhpcyBjYXNlIHN0dWR5LCB3ZSB3aWxsIGNvdmVyIGhvdyB0byBtYWtlIGEgdmFyaWV0eSBvZiB2aXN1YWxpemF0aW9ucyB0byBjb21wYXJlIG11bHRpcGxlIGdyb3VwcyBhY3Jvc3MgdGltZS4gV2Ugd2lsbCBhbHNvIGRlbW9uc3RyYXRlIGhvdyB0byB3b3JrIHdpdGggY29kZWJvb2tzLiBXZSB3aWxsIGNvdmVyIHRoZSBjb25jZXB0IG9mIHN1cnZleSB3ZWlnaHRpbmcgYW5kIGludHJvZHVjZSB0aGUgYHNydnlyYCBwYWNrYWdlLiBXZSB3aWxsIGRpc2N1c3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwb29sZWQgY3Jvc3Mtc2VjdGlvbmFsIGRhdGEgYW5kIHBhbmVsIGRhdGEuIFdlIHdpbGwgZXNwZWNpYWxseSBmb2N1cyBvbiB1c2luZyBwYWNrYWdlcyBhbmQgZnVuY3Rpb25zIGZyb20gdGhlIFtgVGlkeXZlcnNlYF0oaHR0cHM6Ly93d3cudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gZm9yIHdyYW5nbGluZyBkYXRhLCBzdWNoIGFzIGBkcHlyYCBhbmQgZm9yIHZpc3VhbGl6YXRpb24sIHN1Y2hhcyBhcyBgZ2dwbG90MmAuIFRoZSB0aWR5dmVyc2UgaXMgYSBsaWJyYXJ5IG9mIHBhY2thZ2VzIGNyZWF0ZWQgYnkgUlN0dWRpby4gV2hpbGUgc29tZSBzdHVkZW50cyBtYXkgYmUgZmFtaWxpYXIgd2l0aCBwcmV2aW91cyBSIHByb2dyYW1taW5nIHBhY2thZ2VzLCB0aGVzZSBwYWNrYWdlcyBtYWtlIGRhdGEgc2NpZW5jZSBpbiBSIGVzcGVjaWFsbHkgZWZmaWNpZW50LgoKCmBgYHtyLCBvdXQud2lkdGggPSAiMjAlIiwgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ24gPSJjZW50ZXIifQoKaW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly90aWR5dmVyc2UudGlkeXZlcnNlLm9yZy9sb2dvLnBuZyIpCmBgYAoKCioqKiAKCgpXZSB3aWxsIGJlZ2luIGJ5IGxvYWRpbmcgdGhlIHBhY2thZ2VzIHRoYXQgd2Ugd2lsbCBuZWVkOgoKCgoKYGBge3J9CmxpYnJhcnkoaGVyZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShyZWFkcikKbGlicmFyeShzcnZ5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkoY293cGxvdCkKYGBgCgojIyBTZXNzaW9uIGluZm8KCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoKIyBEYXRhIGltcG9ydAoKIyMgRGF0YXNldHMKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQp0YmwgPC0gbGlzdC5maWxlcyhoZXJlOjpoZXJlKCksIHJlY3Vyc2l2ZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiKi54bHN4IikgJT4lIAogIG1hcCh+cmVhZF9leGNlbCguKSkKCnRibF9uYW1lcyA8LSBsaXN0LmZpbGVzKGhlcmU6OmhlcmUoIiIpLCByZWN1cnNpdmUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIioueGxzeCIpICU+JQogIHN0cl9leHRyYWN0KCJueXRzWzJdWzBdWzFdWzUtOV0iKQoKbmFtZXModGJsKSA8LSB0YmxfbmFtZXMKCnRibFtbIm55dHMyMDE1Il1dIDwtIHRibFtbIm55dHMyMDE1Il1dICU+JQogICAgZHBseXI6OnNlbGVjdChwc3UsCiAgICAgICAgICAgICAgICAgIGZpbndndCwKICAgICAgICAgICAgICAgICAgc3RyYXR1bSwKICAgICAgICAgICAgICAgICAgUW4xLCAjQWdlCiAgICAgICAgICAgICAgICAgIFFuMiwgI1NleAogICAgICAgICAgICAgICAgICBRbjMsICNHcmFkZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUW40IiksICNIaXNwYW5pYy9MYXRpbm8KICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlFuNSIpLCAjUmFjZSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgRUZMQVZDSUdUUywKICAgICAgICAgICAgICAgICAgQ0ZMQVZDSUdUUywKICAgICAgICAgICAgICAgICAgRUZMQVZDSUdBUiwKICAgICAgICAgICAgICAgICAgKQoKdGJsW1sibnl0czIwMTYiXV0gPC0gdGJsW1sibnl0czIwMTYiXV0gJT4lCiAgICBkcGx5cjo6c2VsZWN0KHBzdSwKICAgICAgICAgICAgICAgICAgZmlud2d0LAogICAgICAgICAgICAgICAgICBzdHJhdHVtLAogICAgICAgICAgICAgICAgICBRMSwgI0FnZQogICAgICAgICAgICAgICAgICBRMiwgI1NleAogICAgICAgICAgICAgICAgICBRMywgI0dyYWRlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNSIpLCAjUmFjZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBFRkxBVkNJR0FSLAogICAgICAgICAgICAgICAgICBRNTBBLCAjTWVudGhvbCAjIFdoYXQgZmxhdm9ycyBvZiB0b2JhY2NvIHByb2R1Y3RzIGhhdmUgeW91IHVzZWQgaW4gdGhlIHBhc3QgMzAgZGF5cz8gKFNlbGVjdCBvbmUgb3IgbW9yZSkKICAgICAgICAgICAgICAgICAgUTUwQiwgI0Nsb3ZlIG9yIHNwaWNlCiAgICAgICAgICAgICAgICAgIFE1MEMsICNGcnVpdAogICAgICAgICAgICAgICAgICBRNTBELCAjQ2hvY29sYXRlCiAgICAgICAgICAgICAgICAgIFE1MEUsICNBbGNvaG9saWMgRHJpbmsKICAgICAgICAgICAgICAgICAgUTUwRiwgI0NhbmR5L0Rlc3NlcnRzL090aGVyIFN3ZWV0cwogICAgICAgICAgICAgICAgICBRNTBHLCAjU29tZSBPdGhlciBGbGF2b3IgTm90IExpc3RlZCBIZXJlCiAgICAgICAgICAgICAgICAgIFE1MEggI0kgRGlkIE5vdCBVc2UgRmxhdm9yZWQgVG9iYWNjbyBQcm9kdWN0cyBJbiB0aGUgUGFzdAogICAgICAgICAgICAgICAgICApIAoKdGJsW1sibnl0czIwMTciXV0gPC0gdGJsW1sibnl0czIwMTciXV0gJT4lCiAgICBkcGx5cjo6c2VsZWN0KHBzdSwKICAgICAgICAgICAgICAgICAgZmlud2d0LAogICAgICAgICAgICAgICAgICBzdHJhdHVtLAogICAgICAgICAgICAgICAgICBRMSwgI0FnZQogICAgICAgICAgICAgICAgICBRMiwgI1NleAogICAgICAgICAgICAgICAgICBRMywgI0dyYWRlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNSIpLCAjUmFjZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBDQklESVMsCiAgICAgICAgICAgICAgICAgIFE1MEEsICNNZW50aG9sICMgV2hhdCBmbGF2b3JzIG9mIHRvYmFjY28gcHJvZHVjdHMgaGF2ZSB5b3UgdXNlZCBpbiB0aGUgcGFzdCAzMCBkYXlzPyAoU2VsZWN0IG9uZSBvciBtb3JlKQogICAgICAgICAgICAgICAgICBRNTBCLCAjQ2xvdmUgb3Igc3BpY2UKICAgICAgICAgICAgICAgICAgUTUwQywgI0ZydWl0CiAgICAgICAgICAgICAgICAgIFE1MEQsICNDaG9jb2xhdGUKICAgICAgICAgICAgICAgICAgUTUwRSwgI0FsY29ob2xpYyBEcmluawogICAgICAgICAgICAgICAgICBRNTBGLCAjQ2FuZHkvRGVzc2VydHMvT3RoZXIgU3dlZXRzCiAgICAgICAgICAgICAgICAgIFE1MEcsICNTb21lIE90aGVyIEZsYXZvciBOb3QgTGlzdGVkIEhlcmUKICAgICAgICAgICAgICAgICAgUTUwSCAjSSBEaWQgTm90IFVzZSBGbGF2b3JlZCBUb2JhY2NvIFByb2R1Y3RzIEluIHRoZSBQYXN0CiAgICAgICAgICAgICAgICAgICkKCnRibFtbIm55dHMyMDE4Il1dIDwtIHRibFtbIm55dHMyMDE4Il1dICU+JQogICAgZHBseXI6OnNlbGVjdChwc3UsCiAgICAgICAgICAgICAgICAgIGZpbndndCwKICAgICAgICAgICAgICAgICAgc3RyYXR1bSwKICAgICAgICAgICAgICAgICAgUTEsICNBZ2UKICAgICAgICAgICAgICAgICAgUTIsICNTZXgKICAgICAgICAgICAgICAgICAgUTMsICNHcmFkZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUTQiKSwgI0hpc3BhbmljL0xhdGlubwogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUTUiKSwgI1JhY2UKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgUTUwQSwgI01lbnRob2wgIyBXaGF0IGZsYXZvcnMgb2YgdG9iYWNjbyBwcm9kdWN0cyBoYXZlIHlvdSB1c2VkIGluIHRoZSBwYXN0IDMwIGRheXM/IChTZWxlY3Qgb25lIG9yIG1vcmUpCiAgICAgICAgICAgICAgICAgIFE1MEIsICNDbG92ZSBvciBzcGljZQogICAgICAgICAgICAgICAgICBRNTBDLCAjRnJ1aXQKICAgICAgICAgICAgICAgICAgUTUwRCwgI0Nob2NvbGF0ZQogICAgICAgICAgICAgICAgICBRNTBFLCAjQWxjb2hvbGljIERyaW5rCiAgICAgICAgICAgICAgICAgIFE1MEYsICNDYW5keS9EZXNzZXJ0cy9PdGhlciBTd2VldHMKICAgICAgICAgICAgICAgICAgUTUwRywgI1NvbWUgT3RoZXIgRmxhdm9yIE5vdCBMaXN0ZWQgSGVyZQogICAgICAgICAgICAgICAgICBRNTBIICNJIERpZCBOb3QgVXNlIEZsYXZvcmVkIFRvYmFjY28gUHJvZHVjdHMgSW4gdGhlIFBhc3QKICAgICAgICAgICAgICAgICAgKQoKdGJsW1sibnl0czIwMTkiXV0gPC0gdGJsW1sibnl0czIwMTkiXV0gJT4lCiAgICBkcGx5cjo6c2VsZWN0KHBzdSwKICAgICAgICAgICAgICAgICAgZmlud2d0LAogICAgICAgICAgICAgICAgICBzdHJhdHVtLAogICAgICAgICAgICAgICAgICBRMSwgI0FnZQogICAgICAgICAgICAgICAgICBRMiwgI1NleAogICAgICAgICAgICAgICAgICBRMywgI0dyYWRlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNSIpLCAjUmFjZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBFSFRQLAogICAgICAgICAgICAgICAgICBDSFRQLAogICAgICAgICAgICAgICAgICBRNDAsICNCcmFuZywgZS1jaWdhcmV0dGVzCiAgICAgICAgICAgICAgICAgIFE2MkEsICNNZW50aG9sICMgV2hhdCBmbGF2b3JzIG9mIHRvYmFjY28gcHJvZHVjdHMgaGF2ZSB5b3UgdXNlZCBpbiB0aGUgcGFzdCAzMCBkYXlzPyAoU2VsZWN0IG9uZSBvciBtb3JlKQogICAgICAgICAgICAgICAgICBRNjJCLCAjQ2xvdmUgb3Igc3BpY2UKICAgICAgICAgICAgICAgICAgUTYyQywgI0ZydWl0IAogICAgICAgICAgICAgICAgICBRNjJELCAjQ2hvY29sYXRlCiAgICAgICAgICAgICAgICAgIFE2MkUsICNBbGNvaG9saWMgRHJpbmsKICAgICAgICAgICAgICAgICAgUTYyRiwgI0NhbmR5L0Rlc3NlcnRzL090aGVyIFN3ZWV0cwogICAgICAgICAgICAgICAgICBRNjJHLCAjU29tZSBPdGhlciBGbGF2b3IgTm90IExpc3RlZCBIZXJlIAogICAgICAgICAgICAgICAgICApCgpkaXIuY3JlYXRlKCJkYXRhX3JlZHVjZWQiLAogICAgICAgICAgIHNob3dXYXJuaW5ncyA9IEZBTFNFKQoKbWFwcGx5KHdyaXRlX2NzdiwgdGJsLCBwYXRoPXBhc3RlMCgiZG9jcy9kYXRhX3JlZHVjZWQvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyh0YmwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuY3N2JykKICAgICAgICkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0Kc3RhcnRfdGltZSA8LSBTeXMudGltZSgpCmNzdnMgPC0gbGlzdC5maWxlcyhyZWN1cnNpdmUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIqLmNzdiIpICU+JSAKICBtYXAofnJlYWRfY3N2KC4pKQplbmRfdGltZSA8LSBTeXMudGltZSgpCgp0ZXN0X3RpbWUgPC0gZW5kX3RpbWUgLSBzdGFydF90aW1lCgp0aW1lX21lc3NhZ2UgPC0gcGFzdGUoIkR1cmF0aW9uIG9mIGRhdGEgaW1wb3J0OiIsCiAgICAgIHJvdW5kKGFzLm51bWVyaWModGVzdF90aW1lKSAsMyksCiAgICAgIHVuaXRzKHRlc3RfdGltZSkKICAgICAgKQoKY3N2c19uYW1lcyA8LSBsaXN0LmZpbGVzKHJlY3Vyc2l2ZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIiouY3N2IikgJT4lCiAgc3RyX2V4dHJhY3QoIm55dHNbMl1bMF1bMV1bNS05XSIpCgpuYW1lcyhjc3ZzKSA8LSBjc3ZzX25hbWVzCgpueXRzX2RhdGEgPC0gY3N2cwpybShjc3ZzKQpybShjc3ZzX25hbWVzKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQpueXRzX2RhdGEgPC0gbGlzdC5maWxlcyhyZWN1cnNpdmUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICIqLnhsc3giKSAlPiUgCiAgbWFwKH5yZWFkX2V4Y2VsKC4pKQoKbnl0c19kYXRhX25hbWVzIDwtIGxpc3QuZmlsZXMocmVjdXJzaXZlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiKi54bHN4IikgJT4lCiAgc3RyX2V4dHJhY3QoIm55dHNbMl1bMF1bMV1bNS05XSIpCgpuYW1lcyhueXRzX2RhdGEpIDwtIG55dHNfZGF0YV9uYW1lcwoKbmFtZXMobnl0c19kYXRhKQpgYGAKCiMgRGF0YSB3cmFuZ2xpbmcKCmBgYHtyfQpueXRzX2RhdGFbWyJueXRzMjAxNSJdXSA8LSBueXRzX2RhdGFbWyJueXRzMjAxNSJdXSAlPiUKICAgIGRwbHlyOjpzZWxlY3QocHN1LAogICAgICAgICAgICAgICAgICBmaW53Z3QsCiAgICAgICAgICAgICAgICAgIHN0cmF0dW0sCiAgICAgICAgICAgICAgICAgIFFuMSwgI0FnZQogICAgICAgICAgICAgICAgICBRbjIsICNTZXgKICAgICAgICAgICAgICAgICAgUW4zLCAjR3JhZGUKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlFuNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRbjUiKSwgI1JhY2UKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgLUVGTEFWQ0lHVFMsCiAgICAgICAgICAgICAgICAgIC1DRkxBVkNJR1RTLAogICAgICAgICAgICAgICAgICAtRUZMQVZDSUdBUiwKICAgICAgICAgICAgICAgICAgKSAlPiUKICAgIHJlbmFtZShBZ2U9UW4xLAogICAgICAgICAgIGZlbWFsZT1RbjIsCiAgICAgICAgICAgR3JhZGU9UW4zLAogICAgICAgICAgIE5vdF9ITD1RbjRhLAogICAgICAgICAgIEhMX01leD1RbjRiLAogICAgICAgICAgIEhMX1BSPVFuNGMsCiAgICAgICAgICAgSExfQ3ViPVFuNGQsCiAgICAgICAgICAgSExfT3RoZXI9UW40ZSwKICAgICAgICAgICBSYWNlX0FJQU49UW41YSwKICAgICAgICAgICBSYWNlX0FzaWFuPVFuNWIsCiAgICAgICAgICAgUmFjZV9CQUE9UW41YywKICAgICAgICAgICBSYWNlX05IT1BJPVFuNWQsCiAgICAgICAgICAgUmFjZV9XaGl0ZT1RbjVlKSAlPiUKICAgIG11dGF0ZShBZ2U9QWdlKzgsCiAgICAgICAgICAgR3JhZGU9R3JhZGUrNSwKICAgICAgICAgICBicmFuZF9lY2lnPU5BLAogICAgICAgICAgIG1lbnRob2w9TkEsCiAgICAgICAgICAgY2xvdmVfc3BpY2U9TkEsCiAgICAgICAgICAgZnJ1aXQ9TkEsCiAgICAgICAgICAgY2hvY29sYXRlPU5BLAogICAgICAgICAgIGFsY29ob2xpY19kcmluaz1OQSwKICAgICAgICAgICBjYW5keV9kZXNzZXJ0X3N3ZWV0cz1OQSwKICAgICAgICAgICBvdGhlcj1OQSwKICAgICAgICAgICBub191c2U9TkEpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJRIikpCmBgYAoKYGBge3J9CnNhcHBseShueXRzX2RhdGFbWyJueXRzMjAxNSJdXSwgZnVuY3Rpb24oeCkKICAgIHN1bW1hcnkoCiAgICAgICAgZmFjdG9yKHgpCiAgICAgICAgKQogICAgKQpgYGAKCmBgYHtyfQojTm90ZSBhYm91dCBkaWZmZXJlbmNlIGJldHdlZW4gcmVjb2RlIGFuZCBmY3RfcmVjb2RlCm55dHNfZGF0YVtbIm55dHMyMDE1Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE1Il1dICU+JQogIG11dGF0ZV9hbGwofiByZXBsYWNlKC4sIC4gJWluJSBjKCIuIiksIE5BKSkgJT4lCiAgbXV0YXRlKEFnZT1hcy5jaGFyYWN0ZXIoQWdlKSwKICAgICAgICAgR3JhZGU9YXMuY2hhcmFjdGVyKEdyYWRlKQogICAgICAgICApICU+JQogIG11dGF0ZShBZ2U9cmVjb2RlKEFnZSwKICAgICAgICAgICAgICAgICAgICBgMTlgID0gIj4xOCIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgZmVtYWxlPXJlY29kZShmZW1hbGUsCiAgICAgICAgICAgICAgICAgICAgICBgMWA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgYDJgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IE5BLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBOQSkpKQpgYGAKCmBgYHtyfQpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTUiXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKYGBgCgpgYGB7cn0Kbnl0c19kYXRhW1sibnl0czIwMTYiXV0gPC0gbnl0c19kYXRhW1sibnl0czIwMTYiXV0gJT4lCiAgICBkcGx5cjo6c2VsZWN0KHBzdSwKICAgICAgICAgICAgICAgICAgZmlud2d0LAogICAgICAgICAgICAgICAgICBzdHJhdHVtLAogICAgICAgICAgICAgICAgICBRMSwgI0FnZQogICAgICAgICAgICAgICAgICBRMiwgI1NleAogICAgICAgICAgICAgICAgICBRMywgI0dyYWRlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNCIpLCAjSGlzcGFuaWMvTGF0aW5vCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJRNSIpLCAjUmFjZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAtRUZMQVZDSUdBUiwKICAgICAgICAgICAgICAgICAgUTUwQSwgI01lbnRob2wgIyBXaGF0IGZsYXZvcnMgb2YgdG9iYWNjbyBwcm9kdWN0cyBoYXZlIHlvdSB1c2VkIGluIHRoZSBwYXN0IDMwIGRheXM/IChTZWxlY3Qgb25lIG9yIG1vcmUpCiAgICAgICAgICAgICAgICAgIFE1MEIsICNDbG92ZSBvciBzcGljZQogICAgICAgICAgICAgICAgICBRNTBDLCAjRnJ1aXQKICAgICAgICAgICAgICAgICAgUTUwRCwgI0Nob2NvbGF0ZQogICAgICAgICAgICAgICAgICBRNTBFLCAjQWxjb2hvbGljIERyaW5rCiAgICAgICAgICAgICAgICAgIFE1MEYsICNDYW5keS9EZXNzZXJ0cy9PdGhlciBTd2VldHMKICAgICAgICAgICAgICAgICAgUTUwRywgI1NvbWUgT3RoZXIgRmxhdm9yIE5vdCBMaXN0ZWQgSGVyZQogICAgICAgICAgICAgICAgICBRNTBIICNJIERpZCBOb3QgVXNlIEZsYXZvcmVkIFRvYmFjY28gUHJvZHVjdHMgSW4gdGhlIFBhc3QKICAgICAgICAgICAgICAgICAgKSAlPiUKICAgIHJlbmFtZShBZ2U9UTEsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIEdyYWRlPVEzLAogICAgICAgICAgIE5vdF9ITD1RNEEsCiAgICAgICAgICAgSExfTWV4PVE0QiwKICAgICAgICAgICBITF9QUj1RNEMsCiAgICAgICAgICAgSExfQ3ViPVE0RCwKICAgICAgICAgICBITF9PdGhlcj1RNEUsCiAgICAgICAgICAgUmFjZV9BSUFOPVE1QSwKICAgICAgICAgICBSYWNlX0FzaWFuPVE1QiwKICAgICAgICAgICBSYWNlX0JBQT1RNUMsCiAgICAgICAgICAgUmFjZV9OSE9QST1RNUQsCiAgICAgICAgICAgUmFjZV9XaGl0ZT1RNUUsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIG1lbnRob2w9UTUwQSwKICAgICAgICAgICBjbG92ZV9zcGljZT1RNTBCLAogICAgICAgICAgIGZydWl0PVE1MEMsCiAgICAgICAgICAgY2hvY29sYXRlPVE1MEQsCiAgICAgICAgICAgYWxjb2hvbGljX2RyaW5rPVE1MEUsCiAgICAgICAgICAgY2FuZHlfZGVzc2VydF9zd2VldHM9UTUwRiwKICAgICAgICAgICBvdGhlcj1RNTBHLAogICAgICAgICAgIG5vX3VzZT1RNTBIKSAlPiUKICAgIG11dGF0ZShBZ2UgPSBhcy5udW1lcmljKEFnZSkgKyA4LAogICAgICAgICAgIEdyYWRlID0gYXMubnVtZXJpYyhHcmFkZSkgKyA1LAogICAgICAgICAgIGJyYW5kX2VjaWc9TkEpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJRIikpCgpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTYiXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKCm55dHNfZGF0YVtbIm55dHMyMDE2Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE2Il1dICU+JQogIG11dGF0ZV9hbGwofiByZXBsYWNlKC4sIC4gJWluJSBjKCIqIiwgIioqIiksIE5BKSkgJT4lCiAgbXV0YXRlKEFnZT1hcy5jaGFyYWN0ZXIoQWdlKSwKICAgICAgICAgR3JhZGU9YXMuY2hhcmFjdGVyKEdyYWRlKQogICAgICAgICApICU+JQogIG11dGF0ZShBZ2U9cmVjb2RlKEFnZSwKICAgICAgICAgICAgICAgICAgICBgMTlgID0gIj4xOCIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgZmVtYWxlPXJlY29kZShmZW1hbGUsCiAgICAgICAgICAgICAgICAgICAgICBgMWA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgYDJgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJFIiwgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSwKICAgICAgICAgICAgICBsaXN0KH5yZWNvZGUoLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgICBtdXRhdGVfYXQodmFycyhtZW50aG9sOm5vX3VzZSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkKCnNhcHBseShueXRzX2RhdGFbWyJueXRzMjAxNiJdXSwgZnVuY3Rpb24oeCkKICAgIHN1bW1hcnkoCiAgICAgICAgZmFjdG9yKHgpCiAgICAgICAgKQogICAgKQpgYGAKCmBgYHtyfQpueXRzX2RhdGFbWyJueXRzMjAxNyJdXSA8LSBueXRzX2RhdGFbWyJueXRzMjAxNyJdXSAlPiUKICAgIGRwbHlyOjpzZWxlY3QocHN1LAogICAgICAgICAgICAgICAgICBmaW53Z3QsCiAgICAgICAgICAgICAgICAgIHN0cmF0dW0sCiAgICAgICAgICAgICAgICAgIFExLCAjQWdlCiAgICAgICAgICAgICAgICAgIFEyLCAjU2V4CiAgICAgICAgICAgICAgICAgIFEzLCAjR3JhZGUKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlE0IiksICNIaXNwYW5pYy9MYXRpbm8KICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlE1IiksICNSYWNlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgIENCSURJUywKICAgICAgICAgICAgICAgICAgUTUwQSwgI01lbnRob2wgIyBXaGF0IGZsYXZvcnMgb2YgdG9iYWNjbyBwcm9kdWN0cyBoYXZlIHlvdSB1c2VkIGluIHRoZSBwYXN0IDMwIGRheXM/IChTZWxlY3Qgb25lIG9yIG1vcmUpCiAgICAgICAgICAgICAgICAgIFE1MEIsICNDbG92ZSBvciBzcGljZQogICAgICAgICAgICAgICAgICBRNTBDLCAjRnJ1aXQKICAgICAgICAgICAgICAgICAgUTUwRCwgI0Nob2NvbGF0ZQogICAgICAgICAgICAgICAgICBRNTBFLCAjQWxjb2hvbGljIERyaW5rCiAgICAgICAgICAgICAgICAgIFE1MEYsICNDYW5keS9EZXNzZXJ0cy9PdGhlciBTd2VldHMKICAgICAgICAgICAgICAgICAgUTUwRywgI1NvbWUgT3RoZXIgRmxhdm9yIE5vdCBMaXN0ZWQgSGVyZQogICAgICAgICAgICAgICAgICBRNTBIICNJIERpZCBOb3QgVXNlIEZsYXZvcmVkIFRvYmFjY28gUHJvZHVjdHMgSW4gdGhlIFBhc3QKICAgICAgICAgICAgICAgICAgKSAlPiUKICAgIHJlbmFtZShBZ2U9UTEsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIEdyYWRlPVEzLAogICAgICAgICAgIE5vdF9ITD1RNEEsCiAgICAgICAgICAgSExfTWV4PVE0QiwKICAgICAgICAgICBITF9QUj1RNEMsCiAgICAgICAgICAgSExfQ3ViPVE0RCwKICAgICAgICAgICBITF9PdGhlcj1RNEUsCiAgICAgICAgICAgUmFjZV9BSUFOPVE1QSwKICAgICAgICAgICBSYWNlX0FzaWFuPVE1QiwKICAgICAgICAgICBSYWNlX0JBQT1RNUMsCiAgICAgICAgICAgUmFjZV9OSE9QST1RNUQsCiAgICAgICAgICAgUmFjZV9XaGl0ZT1RNUUsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIG1lbnRob2w9UTUwQSwKICAgICAgICAgICBjbG92ZV9zcGljZT1RNTBCLAogICAgICAgICAgIGZydWl0PVE1MEMsCiAgICAgICAgICAgY2hvY29sYXRlPVE1MEQsCiAgICAgICAgICAgYWxjb2hvbGljX2RyaW5rPVE1MEUsCiAgICAgICAgICAgY2FuZHlfZGVzc2VydF9zd2VldHM9UTUwRiwKICAgICAgICAgICBvdGhlcj1RNTBHLAogICAgICAgICAgIG5vX3VzZT1RNTBIKSAlPiUKICAgIG11dGF0ZShBZ2UgPSBhcy5udW1lcmljKEFnZSkgKyA4LAogICAgICAgICAgIEdyYWRlID0gYXMubnVtZXJpYyhHcmFkZSkgKyA1LAogICAgICAgICAgIGJyYW5kX2VjaWc9TkEpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJRIikpCgpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTciXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKCm55dHNfZGF0YVtbIm55dHMyMDE3Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE3Il1dICU+JQogIG11dGF0ZV9hbGwofiByZXBsYWNlKC4sIC4gJWluJSBjKCIqIiwgIioqIiksIE5BKSkgJT4lCiAgbXV0YXRlKEFnZT1hcy5jaGFyYWN0ZXIoQWdlKSwKICAgICAgICAgR3JhZGU9YXMuY2hhcmFjdGVyKEdyYWRlKQogICAgICAgICApICU+JQogIG11dGF0ZShBZ2U9cmVjb2RlKEFnZSwKICAgICAgICAgICAgICAgICAgICBgMTlgID0gIj4xOCIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgZmVtYWxlPXJlY29kZShmZW1hbGUsCiAgICAgICAgICAgICAgICAgICAgICBgMWA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgYDJgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJFIiwgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSwKICAgICAgICAgICAgICBsaXN0KH5yZWNvZGUoLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgICBtdXRhdGVfYXQodmFycyhtZW50aG9sOm5vX3VzZSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkKCnNhcHBseShueXRzX2RhdGFbWyJueXRzMjAxNyJdXSwgZnVuY3Rpb24oeCkKICAgIHN1bW1hcnkoCiAgICAgICAgZmFjdG9yKHgpCiAgICAgICAgKQogICAgKQpgYGAKCmBgYHtyfQpueXRzX2RhdGFbWyJueXRzMjAxOCJdXSA8LSBueXRzX2RhdGFbWyJueXRzMjAxOCJdXSAlPiUKICAgIGRwbHlyOjpzZWxlY3QocHN1LAogICAgICAgICAgICAgICAgICBmaW53Z3QsCiAgICAgICAgICAgICAgICAgIHN0cmF0dW0sCiAgICAgICAgICAgICAgICAgIFExLCAjQWdlCiAgICAgICAgICAgICAgICAgIFEyLCAjU2V4CiAgICAgICAgICAgICAgICAgIFEzLCAjR3JhZGUKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlE0IiksICNIaXNwYW5pYy9MYXRpbm8KICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIlE1IiksICNSYWNlCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoKCJDIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgIFE1MEEsICNNZW50aG9sICMgV2hhdCBmbGF2b3JzIG9mIHRvYmFjY28gcHJvZHVjdHMgaGF2ZSB5b3UgdXNlZCBpbiB0aGUgcGFzdCAzMCBkYXlzPyAoU2VsZWN0IG9uZSBvciBtb3JlKQogICAgICAgICAgICAgICAgICBRNTBCLCAjQ2xvdmUgb3Igc3BpY2UKICAgICAgICAgICAgICAgICAgUTUwQywgI0ZydWl0CiAgICAgICAgICAgICAgICAgIFE1MEQsICNDaG9jb2xhdGUKICAgICAgICAgICAgICAgICAgUTUwRSwgI0FsY29ob2xpYyBEcmluawogICAgICAgICAgICAgICAgICBRNTBGLCAjQ2FuZHkvRGVzc2VydHMvT3RoZXIgU3dlZXRzCiAgICAgICAgICAgICAgICAgIFE1MEcsICNTb21lIE90aGVyIEZsYXZvciBOb3QgTGlzdGVkIEhlcmUKICAgICAgICAgICAgICAgICAgUTUwSCAjSSBEaWQgTm90IFVzZSBGbGF2b3JlZCBUb2JhY2NvIFByb2R1Y3RzIEluIHRoZSBQYXN0CiAgICAgICAgICAgICAgICAgICkgJT4lCiAgICByZW5hbWUoQWdlPVExLAogICAgICAgICAgIGZlbWFsZT1RMiwKICAgICAgICAgICBHcmFkZT1RMywKICAgICAgICAgICBOb3RfSEw9UTRBLAogICAgICAgICAgIEhMX01leD1RNEIsCiAgICAgICAgICAgSExfUFI9UTRDLAogICAgICAgICAgIEhMX0N1Yj1RNEQsCiAgICAgICAgICAgSExfT3RoZXI9UTRFLAogICAgICAgICAgIFJhY2VfQUlBTj1RNUEsCiAgICAgICAgICAgUmFjZV9Bc2lhbj1RNUIsCiAgICAgICAgICAgUmFjZV9CQUE9UTVDLAogICAgICAgICAgIFJhY2VfTkhPUEk9UTVELAogICAgICAgICAgIFJhY2VfV2hpdGU9UTVFLAogICAgICAgICAgIGZlbWFsZT1RMiwKICAgICAgICAgICBtZW50aG9sPVE1MEEsCiAgICAgICAgICAgY2xvdmVfc3BpY2U9UTUwQiwKICAgICAgICAgICBmcnVpdD1RNTBDLAogICAgICAgICAgIGNob2NvbGF0ZT1RNTBELAogICAgICAgICAgIGFsY29ob2xpY19kcmluaz1RNTBFLAogICAgICAgICAgIGNhbmR5X2Rlc3NlcnRfc3dlZXRzPVE1MEYsCiAgICAgICAgICAgb3RoZXI9UTUwRywKICAgICAgICAgICBub191c2U9UTUwSCkgJT4lCiAgICBtdXRhdGUoQWdlID0gYXMubnVtZXJpYyhBZ2UpICsgOCwKICAgICAgICAgICBHcmFkZSA9IGFzLm51bWVyaWMoR3JhZGUpICsgNSwKICAgICAgICAgICBicmFuZF9lY2lnPU5BKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiUSIpKQoKc2FwcGx5KG55dHNfZGF0YVtbIm55dHMyMDE4Il1dLCBmdW5jdGlvbih4KQogICAgc3VtbWFyeSgKICAgICAgICBmYWN0b3IoeCkKICAgICAgICApCiAgICApCgpueXRzX2RhdGFbWyJueXRzMjAxOCJdXSA8LSBueXRzX2RhdGFbWyJueXRzMjAxOCJdXSAlPiUKICBtdXRhdGVfYWxsKH4gcmVwbGFjZSguLCAuICVpbiUgYygiKiIsICIqKiIpLCBOQSkpICU+JQogIG11dGF0ZShBZ2U9YXMuY2hhcmFjdGVyKEFnZSksCiAgICAgICAgIEdyYWRlPWFzLmNoYXJhY3RlcihHcmFkZSkKICAgICAgICAgKSAlPiUKICAgIG11dGF0ZShBZ2U9cmVjb2RlKEFnZSwKICAgICAgICAgICAgICAgICAgICBgMTlgID0gIj4xOCIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgZmVtYWxlPXJlY29kZShmZW1hbGUsCiAgICAgICAgICAgICAgICAgICAgICBgMWA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgYDJgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBOQSkpKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKG1lbnRob2w6bm9fdXNlKSwKICAgICAgICAgICAgICBsaXN0KH5yZWNvZGUoLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKQoKc2FwcGx5KG55dHNfZGF0YVtbIm55dHMyMDE4Il1dLCBmdW5jdGlvbih4KQogICAgc3VtbWFyeSgKICAgICAgICBmYWN0b3IoeCkKICAgICAgICApCiAgICApCmBgYAoKYGBge3J9Cm55dHNfZGF0YVtbIm55dHMyMDE5Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE5Il1dICU+JQogICAgZHBseXI6OnNlbGVjdChwc3UsCiAgICAgICAgICAgICAgICAgIGZpbndndCwKICAgICAgICAgICAgICAgICAgc3RyYXR1bSwKICAgICAgICAgICAgICAgICAgUTEsICNBZ2UKICAgICAgICAgICAgICAgICAgUTIsICNTZXgKICAgICAgICAgICAgICAgICAgUTMsICNHcmFkZQogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUTQiKSwgI0hpc3BhbmljL0xhdGlubwogICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiUTUiKSwgI1JhY2UKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgc3RhcnRzX3dpdGgoIkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUuY2FzZSA9IEZBTFNFKSwKICAgICAgICAgICAgICAgICAgLUVIVFAsCiAgICAgICAgICAgICAgICAgIC1DSFRQLAogICAgICAgICAgICAgICAgICBRNDAsICNCcmFuZywgZS1jaWdhcmV0dGVzCiAgICAgICAgICAgICAgICAgIFE2MkEsICNNZW50aG9sICMgV2hhdCBmbGF2b3JzIG9mIHRvYmFjY28gcHJvZHVjdHMgaGF2ZSB5b3UgdXNlZCBpbiB0aGUgcGFzdCAzMCBkYXlzPyAoU2VsZWN0IG9uZSBvciBtb3JlKQogICAgICAgICAgICAgICAgICBRNjJCLCAjQ2xvdmUgb3Igc3BpY2UKICAgICAgICAgICAgICAgICAgUTYyQywgI0ZydWl0IAogICAgICAgICAgICAgICAgICBRNjJELCAjQ2hvY29sYXRlCiAgICAgICAgICAgICAgICAgIFE2MkUsICNBbGNvaG9saWMgRHJpbmsKICAgICAgICAgICAgICAgICAgUTYyRiwgI0NhbmR5L0Rlc3NlcnRzL090aGVyIFN3ZWV0cwogICAgICAgICAgICAgICAgICBRNjJHLCAjU29tZSBPdGhlciBGbGF2b3IgTm90IExpc3RlZCBIZXJlIAogICAgICAgICAgICAgICAgICApICAlPiUKICAgIHJlbmFtZShicmFuZF9lY2lnPVE0MCwKICAgICAgICAgICBBZ2U9UTEsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIEdyYWRlPVEzLAogICAgICAgICAgIE5vdF9ITD1RNEEsCiAgICAgICAgICAgSExfTWV4PVE0QiwKICAgICAgICAgICBITF9QUj1RNEMsCiAgICAgICAgICAgSExfQ3ViPVE0RCwKICAgICAgICAgICBITF9PdGhlcj1RNEUsCiAgICAgICAgICAgUmFjZV9BSUFOPVE1QSwKICAgICAgICAgICBSYWNlX0FzaWFuPVE1QiwKICAgICAgICAgICBSYWNlX0JBQT1RNUMsCiAgICAgICAgICAgUmFjZV9OSE9QST1RNUQsCiAgICAgICAgICAgUmFjZV9XaGl0ZT1RNUUsCiAgICAgICAgICAgZmVtYWxlPVEyLAogICAgICAgICAgIG1lbnRob2w9UTYyQSwKICAgICAgICAgICBjbG92ZV9zcGljZT1RNjJCLAogICAgICAgICAgIGZydWl0PVE2MkMsCiAgICAgICAgICAgY2hvY29sYXRlPVE2MkQsCiAgICAgICAgICAgYWxjb2hvbGljX2RyaW5rPVE2MkUsCiAgICAgICAgICAgY2FuZHlfZGVzc2VydF9zd2VldHM9UTYyRiwKICAgICAgICAgICBvdGhlcj1RNjJHKSAlPiUKICAgIG11dGF0ZShBZ2UgPSBhcy5udW1lcmljKEFnZSkgKyA4LAogICAgICAgICAgIEdyYWRlID0gYXMubnVtZXJpYyhHcmFkZSkgKyA1LAogICAgICAgICAgIG5vX3VzZT0ibWlzc2luZyIpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJRIikpCgpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTkiXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKCm55dHNfZGF0YVtbIm55dHMyMDE5Il1dIDwtIG55dHNfZGF0YVtbIm55dHMyMDE5Il1dICU+JQogIG11dGF0ZV9hbGwofiByZXBsYWNlKC4sIC4gJWluJSBjKCIuTiIsIi5TIiwiLloiKSwgTkEpKSAlPiUKICBtdXRhdGUoQWdlPWFzLmNoYXJhY3RlcihBZ2UpLAogICAgICAgICBHcmFkZT1hcy5jaGFyYWN0ZXIoR3JhZGUpCiAgICAgICAgICkgJT4lCiAgbXV0YXRlKHBzdT1hcy5jaGFyYWN0ZXIocHN1KSwKICAgICAgICAgQWdlPXJlY29kZShBZ2UsCiAgICAgICAgICAgICAgICAgICAgYDE5YCA9ICI+MTgiLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgIGZlbWFsZT1yZWNvZGUoZmVtYWxlLAogICAgICAgICAgICAgICAgICAgICAgYDFgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGAyYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IE5BKSwKICAgICAgICAgR3JhZGU9cmVjb2RlKEdyYWRlLAogICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJVbmdyYWRlZC9PdGhlciIpLAogICAgICAgICBOb3RfSEw9cmVjb2RlKE5vdF9ITCwKICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIkhMIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpLAogICAgICAgICAgICAgIGxpc3QofnJlY29kZSguLAogICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID0gRkFMU0UpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc3RhcnRzX3dpdGgoIlJhY2UiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgLm1pc3NpbmcgPSBGQUxTRSkpKSAlPiUKICAgIG11dGF0ZV9hdCh2YXJzKHN0YXJ0c193aXRoKCJFIiwgaWdub3JlLmNhc2UgPSBGQUxTRSksCiAgICAgICAgICAgICAgICAgICBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSwKICAgICAgICAgICAgICBsaXN0KH5yZWNvZGUoLiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gTkEpKSkgJT4lCiAgICBtdXRhdGUoYnJhbmRfZWNpZyA9IHJlY29kZShicmFuZF9lY2lnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMWAgPSAiT3RoZXIiLCAjbGV2ZWxzIDEsOCBjb21iaW5lZCB0byBgT3RoZXJgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAiQmx1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gIkpVVUwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiTG9naWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNWAgPSAiTWFya1RlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA2YCA9ICJOSk9ZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDdgID0gIlZ1c2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgOGAgPSAiT3RoZXIiKSkgJT4lCiAgICBtdXRhdGVfYXQodmFycyhtZW50aG9sOm5vX3VzZSksCiAgICAgICAgICAgICAgbGlzdCh+cmVjb2RlKC4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taXNzaW5nID1GQUxTRSkpKSAjQXNrIE1pY2hhZWwgYWJvdXQgdGhpcyBpZiB1bmNsZWFyCgpzYXBwbHkobnl0c19kYXRhW1sibnl0czIwMTkiXV0sIGZ1bmN0aW9uKHgpCiAgICBzdW1tYXJ5KAogICAgICAgIGZhY3Rvcih4KQogICAgICAgICkKICAgICkKYGBgCgpgYGB7cn0Kbnl0c19kYXRhIDwtIG55dHNfZGF0YSAlPiUKICBtYXBfZGYoYmluZF9yb3dzLCAuaWQgPSAieWVhciIpICU+JQogIG11dGF0ZSh5ZWFyPWFzLm51bWVyaWMoc3RyX3JlbW92ZSh5ZWFyLCJueXRzIikpKQoKc2FwcGx5KG55dHNfZGF0YSwgY2xhc3MpCgpzYXBwbHkobnl0c19kYXRhLCBmdW5jdGlvbih4KQogICAgc3VtbWFyeSgKICAgICAgICBmYWN0b3IoeCkKICAgICAgICApCiAgICApCmBgYAoKPHN0eWxlPgpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30KPC9zdHlsZT4KPGRpdiBjbGFzcyA9ICJibHVlIj4KClJlbWluZGVyOiBDdXJyZW50IHVzZXJzIGFyZSBhIHN1YnNldCBvZiBldmVyIHVzZXJzLiAKCjwvZGl2PgoKIyBEYXRhIHZpc3VhbGl6YXRpb24KCiMjIFF1ZXN0aW9uIDEgCgpgYGB7cn0KcGxvdDEgPC0gbnl0c19kYXRhICU+JQogICAgbXV0YXRlKHRvYmFjY29fc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgdG9iYWNjb19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSkgJT4lCiAgICBtdXRhdGUodG9iYWNjb19ldmVyID0gY2FzZV93aGVuKHRvYmFjY29fc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9iYWNjb19zdW1fZXZlciA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgdG9iYWNjb19jdXJyZW50ID0gY2FzZV93aGVuKHRvYmFjY29fc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9iYWNjb19zdW1fY3VycmVudCA9PTAgfiBGQUxTRSkpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgICBzdW1tYXJpc2UodG9iYWNjb19ldmVyX3llYXI9KHN1bSh0b2JhY2NvX2V2ZXIsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEodG9iYWNjb19ldmVyKSksCiAgICAgICAgICAgICAgdG9iYWNjb19jdXJyZW50X3llYXI9KHN1bSh0b2JhY2NvX2N1cnJlbnQsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEodG9iYWNjb19jdXJyZW50KSkpICU+JQogICAgcmVuYW1lKCJFdmVyIj10b2JhY2NvX2V2ZXJfeWVhciwKICAgICAgICAgICAiQ3VycmVudCI9dG9iYWNjb19jdXJyZW50X3llYXIpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIlVzZXIiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwgbGluZXR5cGU9VXNlcikpICsKICAgIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoMiwxKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDcwLGJ5PTEwKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzZXEoMCw3MCxieT0xMCksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLDcwKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHRpdGxlID0gIkhvdyBkb2VzIG5pY290aW5lIHVzZSB2YXJ5IG92ZXIgdGhlIHllYXJzPyIsCiAgICAgICAgIHN1YnRpdGxlID0gIkN1cnJlbnQgYW5kIGV2ZXIgdXNlcnMgb2Ygbmljb3RpbmUgcHJvZHVjdHMiLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdDEgCmBgYAoKIyMgUXVlc3Rpb24gMgoKYGBge3J9CnBsb3QyIDwtIG55dHNfZGF0YSAlPiUKICAgIGdyb3VwX2J5KHllYXIsCiAgICAgICAgICAgICBmZW1hbGUpICU+JQogICAgc3VtbWFyaXNlKEVFTENJR1RfeWVhcj0oc3VtKEVFTENJR1QsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoRUVMQ0lHVCkpLAogICAgICAgICAgICAgIENFTENJR1RfeWVhcj0oc3VtKENFTENJR1QsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoQ0VMQ0lHVCkpKSAlPiUgCiAgICBmaWx0ZXIoIWlzLm5hKGZlbWFsZSkpICU+JQogICAgcmVuYW1lKCJFLWNpZ2FyZXR0ZXMsIEV2ZXIiPUVFTENJR1RfeWVhciwKICAgICAgICAgICAiRS1jaWdhcmV0dGVzLCBDdXJyZW50Ij1DRUxDSUdUX3llYXIpICU+JQogICNjb252ZXJ0aW5nIGFsbCBjb2x1bW5zIGJldHdlZW4gYW5kIGluY2x1ZGluZyBgRS1jaWdhcmV0dGVzLCBFdmVyYCBhbmQgYEUtY2lnYXJldHRlcywgQ3VycmVudGAgaW50byBvbmUgY29sdW1uIGNhbGxlZCBjYXRlZ29yeQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBgRS1jaWdhcmV0dGVzLCBFdmVyYDpgRS1jaWdhcmV0dGVzLCBDdXJyZW50YCwgbmFtZXNfdG8gPSAiQ2F0ZWdvcnkiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpJT4lCiAgICBtdXRhdGUoVXNlciA9IGNhc2Vfd2hlbihDYXRlZ29yeSA9PSAiRS1jaWdhcmV0dGVzLCBFdmVyIiB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09ICJFLWNpZ2FyZXR0ZXMsIEN1cnJlbnQiIH4gIkN1cnJlbnQiKSkgJT4lCiAgICBtdXRhdGUoU2V4ID0gY2FzZV93aGVuKGZlbWFsZSA9PSBUUlVFIH4gIkZlbWFsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVtYWxlID09IEZBTFNFIH4gIk1hbGVzIikpICU+JQogICAgZ2dwbG90KGFlcyh4PXllYXIseT1gUGVyY2VudGFnZSBvZiBzdHVkZW50c2AsIGNvbG9yPVNleCwgbGluZXR5cGU9VXNlcikpICsKICAgIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoMiwxKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiSG93IGRvIHZhcGluZyByYXRlcyBjb21wYXJlIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXM/IiwKICAgICAgICAgc3VidGl0bGUgPSAiQ3VycmVudCBhbmQgZXZlciB1c2VycyBieSBnZW5kZXIiLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdDIKYGBgCgojIyBRdWVzdGlvbiAzCgpXaGF0IHZhcGluZyBicmFuZHMgYW5kIGZsYXZvcnMgYXBwZWFyIHRvIGJlIHVzZWQgdGhlIG1vc3QgZnJlcXVlbnRseT8KCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuY2FwPSJIdWFuZyBKLCBEdWFuIFosIEt3b2sgSiwgZXQgYWwuIFRvYiBDb250cm9sIDIwMTk7Mjg6MTQ24oCTMTUxLiIsIG91dC53aWR0aCA9ICcxMDAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1nIiwgIkh1YW5nSl9EdWFuWl9Ld29rSl9ldF9hbF9Ub2JhY2NvQ29udHJvbF9GaWd1cmUxLnBuZyIpKQpgYGAKCltQYXBlcl0oaHR0cHM6Ly90b2JhY2NvY29udHJvbC5ibWouY29tL2NvbnRlbnQvdG9iYWNjb2NvbnRyb2wvMjgvMi8xNDYuZnVsbC5wZGYpCgoKYGBge3J9CnBsb3QzIDwtIG55dHNfZGF0YSAlPiUKICAgIGZpbHRlcih5ZWFyPT0yMDE5KSAlPiUKICAgIGdyb3VwX2J5KGJyYW5kX2VjaWcpICU+JQogICAgZmlsdGVyKCFpcy5uYShicmFuZF9lY2lnKSkgJT4lCiAgICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgICBtdXRhdGUodG90YWwgPSBzdW0obiksCiAgICAgICAgICAgUGVyY2VudCA9IG4qMTAwL3RvdGFsKSAlPiUKICAgIG11dGF0ZShicmFuZF9lY2lnID0gZmN0X3Jlb3JkZXIoYnJhbmRfZWNpZywgZGVzYyhQZXJjZW50KSkpICU+JQogICAgZ2dwbG90KGFlcyh4PWJyYW5kX2VjaWcseT1QZXJjZW50LCBmaWxsPWJyYW5kX2VjaWcpKSArCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgbGFicyh0aXRsZSA9ICJXaGF0IHZhcGluZyBicmFuZHMgYXBwZWFyIHRvIGJlIHVzZWQgdGhlIG1vc3QgZnJlcXVlbnRseT8iLAogICAgICAgICBzdWJ0aXRsZSA9ICJCcmFuZCBvZiBlLWNpZ2FyZXR0ZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBpbiB0aGUgbGFzdCAzMCBkYXlzICgyMDE5KSIsCiAgICAgICAgIHkgPSAiJSBvZiBlLWNpZ2FyZXR0ZSB1c2VycyByZXNwb25kaW5nIikKCnBsb3QzCmBgYAoKYGBge3J9CnBsb3Q0IDwtIG55dHNfZGF0YSAlPiUKICBmaWx0ZXIoeWVhciE9MjAxNSkgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKE1lbnRob2w9KHN1bShtZW50aG9sLCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKG1lbnRob2wpKSwKICAgICAgICAgICAgICBgQ2xvdmUgb3IgU3BpY2VgPShzdW0oY2xvdmVfc3BpY2UsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoY2xvdmVfc3BpY2UpKSwKICAgICAgICAgICAgICBgRnJ1aXRgPShzdW0oZnJ1aXQsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoZnJ1aXQpKSwKICAgICAgICAgICAgICBgQ2hvY29sYXRlYD0oc3VtKGNob2NvbGF0ZSwgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgICAgc3VtKCFpcy5uYShjaG9jb2xhdGUpKSwKICAgICAgICAgICAgICBgQWxjb2hvbGljIERyaW5rYD0oc3VtKGFsY29ob2xpY19kcmluaywgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgICAgc3VtKCFpcy5uYShhbGNvaG9saWNfZHJpbmspKSwKICAgICAgICAgICAgICBgQ2FuZHkvRGVzc2VydHMvU3dlZXRzYD0oc3VtKGNhbmR5X2Rlc3NlcnRfc3dlZXRzLCBuYS5ybSA9IFRSVUUpKjEwMCkvc3VtKCFpcy5uYShjYW5keV9kZXNzZXJ0X3N3ZWV0cykpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC15ZWFyLCBuYW1lc190byA9ICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIiwgdmFsdWVzX3RvID0gIkZsYXZvciIpICU+JQoKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT1gUGVyY2VudGFnZSBvZiBzdHVkZW50c2AsIGNvbG9yPUZsYXZvcikpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnModGl0bGUgPSAiV2hhdCBmbGF2b3JzIGFwcGVhciB0byBiZSB1c2VkIHRoZSBtb3N0IGZyZXF1ZW50bHkgaW4gbmljb3RpbmUgcHJvZHVjdHM/IiwKICAgICAgIHN1YnRpdGxlID0gIkZsYXZvcnMgb2YgdG9iYWNjbyBwcm9kdWN0cyB1c2VkIGluIHRoZSBwYXN0IDMwIGRheXMiKQoKcGxvdDQgCmBgYAoKYGBge3J9CnBsb3Q1IDwtIG55dHNfZGF0YSAlPiUKICBmaWx0ZXIoeWVhciE9MjAxNSkgJT4lCiAgZmlsdGVyKG1lbnRob2w9PVRSVUV8CiAgICAgICAgICAgY2xvdmVfc3BpY2U9PVRSVUV8CiAgICAgICAgICAgZnJ1aXQ9PVRSVUV8CiAgICAgICAgICAgY2hvY29sYXRlPT1UUlVFfAogICAgICAgICAgIGFsY29ob2xpY19kcmluaz09VFJVRXwKICAgICAgICAgICBjYW5keV9kZXNzZXJ0X3N3ZWV0cz09VFJVRXwKICAgICAgICAgICBvdGhlcj09VFJVRSkgJT4lCiAgbXV0YXRlKGVjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgRUVMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBDRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fZXZlciA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJDIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBzZWxlY3QoLiwtQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSkpICU+JQogICAgbXV0YXRlKGVjaWdfZXZlciA9IGNhc2Vfd2hlbihlY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIGVjaWdfY3VycmVudCA9IGNhc2Vfd2hlbihlY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2V2ZXIgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpKSAlPiUKICBtdXRhdGUoZWNpZ19vbmx5X2V2ZXIgPSBjYXNlX3doZW4oZWNpZ19ldmVyID09IFRSVUUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXIgPT1GQUxTRSB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBGQUxTRSksCiAgICAgICAgICAgZWNpZ19vbmx5X2N1cnJlbnQgPSBjYXNlX3doZW4oZWNpZ19jdXJyZW50ID09IFRSVUUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfZXZlciA9PUZBTFNFIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19vbmx5X2V2ZXIgPSBjYXNlX3doZW4obm9uX2VjaWdfZXZlciA9PSBUUlVFICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX2V2ZXIgPT1GQUxTRSB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBGQUxTRSksCiAgICAgICAgICAgbm9uX2VjaWdfb25seV9jdXJyZW50ID0gY2FzZV93aGVuKG5vbl9lY2lnX2N1cnJlbnQgPT0gVFJVRSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNpZ19ldmVyID09RkFMU0UgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gRkFMU0UpKSAlPiUKICBtdXRhdGUoR3JvdXAgPSBjYXNlX3doZW4oZWNpZ19vbmx5X2V2ZXI9PVRSVUUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfb25seV9jdXJyZW50PT1UUlVFIH4gIk9ubHkgZS1jaWdhcmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX29ubHlfZXZlcj09VFJVRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX29ubHlfY3VycmVudD09VFJVRSB+ICJPbmx5IG90aGVyIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJCb3RoIikpICU+JQogIGZpbHRlcihHcm91cCE9IkJvdGgiKSAlPiUKICBncm91cF9ieSh5ZWFyLCBHcm91cCkgJT4lCiAgc3VtbWFyaXNlKGBNZW50aG9sYD0oc3VtKG1lbnRob2wsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICBzdW0oIWlzLm5hKG1lbnRob2wpKSwKICAgICAgICAgICAgICBgQ2xvdmUgb3IgU3BpY2VgPShzdW0oY2xvdmVfc3BpY2UsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICBzdW0oIWlzLm5hKGNsb3ZlX3NwaWNlKSksCiAgICAgICAgICAgICAgYEZydWl0YD0oc3VtKGZydWl0LCBuYS5ybSA9IFRSVUUpKjEwMCkvc3VtKCFpcy5uYShmcnVpdCkpLAogICAgICAgICAgICAgIGBDaG9jb2xhdGVgPShzdW0oY2hvY29sYXRlLCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgc3VtKCFpcy5uYShjaG9jb2xhdGUpKSwKICAgICAgICAgICAgICBgQWxjb2hvbGljIERyaW5rYD0oc3VtKGFsY29ob2xpY19kcmluaywgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgIHN1bSghaXMubmEoYWxjb2hvbGljX2RyaW5rKSksCiAgICAgICAgICAgICAgYENhbmR5L0Rlc3NlcnRzL1N3ZWV0c2A9KHN1bShjYW5keV9kZXNzZXJ0X3N3ZWV0cywgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgIHN1bSghaXMubmEoY2FuZHlfZGVzc2VydF9zd2VldHMpKSwKICAgICAgICAgICAgYE90aGVyYD0oc3VtKG90aGVyLCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgc3VtKCFpcy5uYShvdGhlcikpLAogICAgICAgICAgICBSZXNwb25kZW50cz1uKCkpICU+JQogICNjb252ZXJ0aW5nIGFsbCBjb2x1bW5zIGJldHdlZW4gYW5kIGluY2x1ZGluZyBNZW50aG9sIGFuZCBPdGhlciB0byBvbmUgY29sdW1uIGNhbGxlZCBGbGF2b3IKICBwaXZvdF9sb25nZXIoY29scyA9IE1lbnRob2w6T3RoZXIsIG5hbWVzX3RvID0gIkZsYXZvciIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIikgJT4lCiAgZmlsdGVyKCFpcy5uYShgUGVyY2VudGFnZSBvZiBzdHVkZW50c2ApLAogICAgICAgICBGbGF2b3IhPSJPdGhlciIpICU+JQogIGdyb3VwX2J5KEZsYXZvcikgJT4lCiAgbXV0YXRlKGFmZmlybWF0aXZlPShSZXNwb25kZW50cyAqIGBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCkvMTAwKSAlPiUKICBtdXRhdGUoZmxhdm9yX21lYW4gPSBzdW0oYWZmaXJtYXRpdmUpL3N1bShSZXNwb25kZW50cykpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoZmxhdm9yX21lYW5fcmFuayA9IGRlbnNlX3JhbmsoZmxhdm9yX21lYW4pLAogICAgICAgICBGbGF2b3IgPSBmY3RfcmVvcmRlcihGbGF2b3IsIGZsYXZvcl9tZWFuX3JhbmspKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT1gUGVyY2VudGFnZSBvZiBzdHVkZW50c2AsIGNvbG9yPUdyb3VwKSkgKwogIGZhY2V0X3dyYXAoLn5GbGF2b3IsbmNvbD0zKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKyAKICBsYWJzKHRpdGxlID0gIkFtb25nIHVzZXJzIG9mIG9ubHkgb25lIHR5cGUgb2YgcHJvZHVjdCwgd2hhdCB2YXBpbmcgZmxhdm9ycyBhcHBlYXIgdG8gYmUgdXNlZCB0aGUgbW9zdCBmcmVxdWVudGx5PyIsCiAgICAgICBzdWJ0aXRsZSA9ICJQZXJjZW50IHJlcG9ydGluZyBvbmx5IGUtY2lnYXJldHRlIHVzZSB2cyBvbmx5IG90aGVyIG5pY290aW5lIHByb2R1Y3QgdXNlIikKCnBsb3Q1CmBgYAoKIyMgUXVlc3Rpb24gNAoKSGF2ZSB2YXBpbmcgcmF0ZXMgcG9zc2libHkgaW5mbHVlbmNlZCB0b2JhY2NvL25pY290aW5lIHVzZT8KCmBgYHtyfQpwbG90NiA8LSBueXRzX2RhdGEgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShFQ0lHVF95ZWFyPShzdW0oRUNJR1QsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoRUNJR1QpKSwKICAgICAgICAgICAgICBFRUxDSUdUX3llYXI9KHN1bShFRUxDSUdULCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKEVFTENJR1QpKSwKICAgICAgICAgICAgICBDQ0lHVF95ZWFyPShzdW0oQ0NJR1QsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoQ0NJR1QpKSwKICAgICAgICAgICAgICBDRUxDSUdUX3llYXI9KHN1bShDRUxDSUdULCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKENFTENJR1QpKSkgJT4lCiAgICByZW5hbWUoIkNpZ2FyZXR0ZXMsIEV2ZXIiPUVDSUdUX3llYXIsCiAgICAgICAgICAgIkUtY2lnYXJldHRlcywgRXZlciI9RUVMQ0lHVF95ZWFyLAogICAgICAgICAgICJDaWdhcmV0dGVzLCBDdXJyZW50Ij1DQ0lHVF95ZWFyLAogICAgICAgICAgICJFLWNpZ2FyZXR0ZXMsIEN1cnJlbnQiPUNFTENJR1RfeWVhcikgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHM9IC15ZWFyLCBuYW1lc190byA9ICJDYXRlZ29yeSIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIiklPiUKICAgICMgZ2F0aGVyKGtleT1DYXRlZ29yeSwKICAgICMgICAgICAgIHZhbHVlPWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwKICAgICMgICAgICAgIC15ZWFyKSAlPiUKICAgIG11dGF0ZShVc2VyID0gY2FzZV93aGVuKENhdGVnb3J5ID09ICJDaWdhcmV0dGVzLCBFdmVyIiB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09ICJFLWNpZ2FyZXR0ZXMsIEV2ZXIiIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0gIkNpZ2FyZXR0ZXMsIEN1cnJlbnQiIH4gIkN1cnJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0gIkUtY2lnYXJldHRlcywgQ3VycmVudCIgfiAiQ3VycmVudCIpKSAlPiUKICAgIG11dGF0ZShQcm9kdWN0ID0gY2FzZV93aGVuKENhdGVnb3J5ID09ICJDaWdhcmV0dGVzLCBFdmVyIiB+ICJDaWdhcmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09ICJFLWNpZ2FyZXR0ZXMsIEV2ZXIiIH4gIkUtY2lnYXJldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSAiQ2lnYXJldHRlcywgQ3VycmVudCIgfiAiQ2lnYXJldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSAiRS1jaWdhcmV0dGVzLCBDdXJyZW50IiB+ICJFLWNpZ2FyZXR0ZXMiKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwgY29sb3I9UHJvZHVjdCwgbGluZXR5cGU9VXNlcikpICsKICAgIGdlb21fbGluZSgpICsgCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoMiwxKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHRpdGxlID0gIkhvdyBkb2VzIGUtY2lnYXJldHRlIHVzZSBjb21wYXJlIHRvIGNpZ2FyZXR0ZSB1c2U/IiwKICAgICAgICAgc3VidGl0bGUgPSAiQ3VycmVudCBhbmQgZXZlciB1c2VycyBvZiBlLWNpZ2FyZXR0ZXMgYW5kIGNpZ2FyZXR0ZXMiLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdDYKYGBgCgpgYGB7cn0KcGxvdDcgPC0gbnl0c19kYXRhICU+JQogICAgbXV0YXRlKGVjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgRUVMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBDRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fZXZlciA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJDIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBzZWxlY3QoLiwtQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSkpICU+JQogICAgbXV0YXRlKGVjaWdfZXZlciA9IGNhc2Vfd2hlbihlY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIGVjaWdfY3VycmVudCA9IGNhc2Vfd2hlbihlY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2V2ZXIgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpKSAlPiUKICAgIGdyb3VwX2J5KHllYXIpICU+JQogICAgc3VtbWFyaXNlKGVjaWdfZXZlcl95ZWFyPShzdW0oZWNpZ19ldmVyLCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKGVjaWdfZXZlcikpLAogICAgICAgICAgICAgIGVjaWdfY3VycmVudF95ZWFyPShzdW0oZWNpZ19jdXJyZW50LCBuYS5ybSA9IFRSVUUpKjEwMCkvCiAgICAgICAgICAgICAgICBzdW0oIWlzLm5hKGVjaWdfY3VycmVudCkpLAogICAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXJfeWVhcj0oc3VtKG5vbl9lY2lnX2V2ZXIsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEobm9uX2VjaWdfZXZlcikpLAogICAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhcj0oc3VtKG5vbl9lY2lnX2N1cnJlbnQsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEobm9uX2VjaWdfY3VycmVudCkpKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIkNhdGVnb3J5IiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHMiKSAlPiUKICAgIG11dGF0ZShVc2VyID0gY2FzZV93aGVuKENhdGVnb3J5ID09ImVjaWdfZXZlcl95ZWFyIiB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0ibm9uX2VjaWdfZXZlcl95ZWFyIiB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0iZWNpZ19jdXJyZW50X3llYXIiIH4gIkN1cnJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJub25fZWNpZ19jdXJyZW50X3llYXIiIH4gIkN1cnJlbnQiKSkgJT4lCiAgICBtdXRhdGUoUHJvZHVjdCA9IGNhc2Vfd2hlbihDYXRlZ29yeSA9PSJlY2lnX2V2ZXJfeWVhciIgfiAiRS1jaWdhcmV0dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0ibm9uX2VjaWdfZXZlcl95ZWFyIiB+ICJPdGhlciBwcm9kdWN0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09ImVjaWdfY3VycmVudF95ZWFyIiB+ICJFLWNpZ2FyZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJub25fZWNpZ19jdXJyZW50X3llYXIiIH4gIk90aGVyIHByb2R1Y3RzIikpICU+JQogICAgZmlsdGVyKFVzZXI9PSJFdmVyIikgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwgY29sb3I9UHJvZHVjdCkpICsKICAgIGdlb21fbGluZShsaW5ldHlwZT0xKSArICMgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEwLCA2MCwgYnkgPSAxMCksIGxpbWl0cyA9IGMoMTAsNjApKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiSG93IGRvZXMgZS1jaWdhcmV0dGUgZXZlciB1c2UgY29tcGFyZSB0byBldmVyIHVzZSBvZiBvdGhlciBwcm9kdWN0cyBvdmVyIHRoZSB5ZWFycz8iLAogICAgICAgICBzdWJ0aXRsZSA9ICJFLWNpZ2FyZXR0ZSBhbmQgbm9uLWUtY2lnYXJldHRlIHVzZSIsCiAgICAgICAgIHkgPSAiJSBvZiBzdHVkZW50cyIpCgpwbG90NwpgYGAKCmBgYHtyfQpwbG90OCA8LSBueXRzX2RhdGEgJT4lCiAgICBtdXRhdGUoZWNpZ19zdW1fZXZlciA9IHNlbGVjdCguLCBFRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBlY2lnX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIENFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIG5vbl9lY2lnX3N1bV9ldmVyID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJFIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBzZWxlY3QoLiwtRUVMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgbm9uX2VjaWdfc3VtX2N1cnJlbnQgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkMiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIHNlbGVjdCguLC1DRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSkgJT4lCiAgICBtdXRhdGUoZWNpZ19ldmVyID0gY2FzZV93aGVuKGVjaWdfc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNpZ19zdW1fZXZlciA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgZWNpZ19jdXJyZW50ID0gY2FzZV93aGVuKGVjaWdfc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNpZ19zdW1fY3VycmVudCA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgbm9uX2VjaWdfZXZlciA9IGNhc2Vfd2hlbihub25fZWNpZ19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fZWNpZ19zdW1fZXZlciA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgbm9uX2VjaWdfY3VycmVudCA9IGNhc2Vfd2hlbihub25fZWNpZ19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fZWNpZ19zdW1fY3VycmVudCA9PTAgfiBGQUxTRSkpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgICBzdW1tYXJpc2UoZWNpZ19ldmVyX3llYXI9KHN1bShlY2lnX2V2ZXIsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoZWNpZ19ldmVyKSksCiAgICAgICAgICAgICAgZWNpZ19jdXJyZW50X3llYXI9KHN1bShlY2lnX2N1cnJlbnQsIG5hLnJtID0gVFJVRSkqMTAwKS8KICAgICAgICAgICAgICAgIHN1bSghaXMubmEoZWNpZ19jdXJyZW50KSksCiAgICAgICAgICAgICAgbm9uX2VjaWdfZXZlcl95ZWFyPShzdW0obm9uX2VjaWdfZXZlciwgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgICAgc3VtKCFpcy5uYShub25fZWNpZ19ldmVyKSksCiAgICAgICAgICAgICAgbm9uX2VjaWdfY3VycmVudF95ZWFyPShzdW0obm9uX2VjaWdfY3VycmVudCwgbmEucm0gPSBUUlVFKSoxMDApLwogICAgICAgICAgICAgICAgc3VtKCFpcy5uYShub25fZWNpZ19jdXJyZW50KSkpICU+JQogICAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAteWVhciwgbmFtZXNfdG8gPSAiQ2F0ZWdvcnkiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpICU+JQogICAgIyBnYXRoZXIoa2V5PUNhdGVnb3J5LAogICAgIyAgICAgICAgdmFsdWU9YFBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHNgLAogICAgIyAgICAgICAgLXllYXIpICU+JQogICAgbXV0YXRlKFVzZXIgPSBjYXNlX3doZW4oQ2F0ZWdvcnkgPT0iZWNpZ19ldmVyX3llYXIiIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJub25fZWNpZ19ldmVyX3llYXIiIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJlY2lnX2N1cnJlbnRfeWVhciIgfiAiQ3VycmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09Im5vbl9lY2lnX2N1cnJlbnRfeWVhciIgfiAiQ3VycmVudCIpKSAlPiUKICAgIG11dGF0ZShQcm9kdWN0ID0gY2FzZV93aGVuKENhdGVnb3J5ID09ImVjaWdfZXZlcl95ZWFyIiB+ICJFLWNpZ2FyZXR0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeSA9PSJub25fZWNpZ19ldmVyX3llYXIiIH4gIk90aGVyIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgPT0iZWNpZ19jdXJyZW50X3llYXIiIH4gIkUtY2lnYXJldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5ID09Im5vbl9lY2lnX2N1cnJlbnRfeWVhciIgfiAiT3RoZXIgcHJvZHVjdHMiKSkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwgY29sb3I9UHJvZHVjdCwgbGluZXR5cGU9VXNlcikpICsKICAgIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygyLDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgYnkgPSAxMCksIGxpbWl0cyA9IGMoMCw2MCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgbGFicyh0aXRsZSA9ICJIb3cgZG9lcyBlLWNpZ2FyZXR0ZSB1c2UgY29tcGFyZSB0byB1c2Ugb2Ygb3RoZXIgcHJvZHVjdHMgb3ZlciB0aGUgeWVhcnM/IiwKICAgICAgICAgc3VidGl0bGUgPSAiRS1jaWdhcmV0dGUgYW5kIG5vbi1lLWNpZ2FyZXR0ZSB1c2UiLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdDgKYGBgCgojIyMgVW53ZWlnaHRlZCBTYW1wbGUKCmBgYHtyLCBmaWcuaGVpZ2h0PTEwfQpwbG90QV91dyA8LSBwbG90MSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgbGFicyh0aXRsZSA9ICJOaWNvdGluZSBwcm9kdWN0IHVzZXJzIG1vcmUgcHJldmFsZW50IGFmdGVyIDIwMTciLAogICAgICAgICBzdWJ0aXRsZSA9IE5VTEwsCiAgICAgICAgIHkgPSAiJSBvZiBzdHVkZW50cyIpCgpwbG90Ql91dyA8LSBwbG90NyArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIGxhYnModGl0bGUgPSAiJSBFdmVyIHRyeWluZyBlLWNpZ2FyZXR0ZXMgaW5jcmVhc2VzICZcbiUgZXZlciB0cnlpbmcgb3RoZXIgcHJvZHVjdHMgZGVjcmVhc2VzIiwKICAgICAgICAgc3VidGl0bGUgPSBOVUxMLAogICAgICAgICB5ID0gIiUgb2Ygc3R1ZGVudHMiKQoKcGxvdENfdXcgPC0gcGxvdDggKyAKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICBsYWJzKHRpdGxlID0gIiUgVXNpbmcgZS1jaWdhcmV0dGVzIGluY3JlYXNlcyAmXG4lIHVzaW5nIE90aGVyIHByb2R1Y3RzIGRlY3JlYXNlcyIsCiAgICAgICAgIHN1YnRpdGxlID0gTlVMTCwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCnRpdGxlX3V3IDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgKICAgICJIYXZlIHZhcGluZyByYXRlcyBwb3NzaWJseSBpbmZsdWVuY2VkIHRvYmFjY28vbmljb3RpbmUgdXNlPyIsCiAgICBmb250ZmFjZSA9ICdib2xkJywKICAgIHNpemU9MTQsCiAgICB4ID0gMCwKICAgIGhqdXN0ID0gMAogICkgKwogIHRoZW1lKAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMCkKICApCgpwbG90c0FfdXcgPC0gcGxvdF9ncmlkKHBsb3RBX3V3LAogICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygxLDEpKQpwbG90c0JDX3V3IDwtIHBsb3RfZ3JpZChwbG90Ql91dywKICAgICAgICAgICAgICAgICAgICAgICAgcGxvdENfdXcsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsMSkpCgpsZWdlbmRfdXcgPC0gZ2V0X2xlZ2VuZChwbG90Ql91dyArCiAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikpCgpmaWd1cmVfdXcgPC0gcGxvdF9ncmlkKHRpdGxlX3V3LAogICAgICAgICAgICAgICAgICAgICAgIHBsb3RzQV91dywKICAgICAgICAgICAgICAgICAgICAgICBwbG90c0JDX3V3LAogICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZF91dywKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEpLAogICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gMS4wKQoKZmlndXJlX3V3CmBgYAoKIyMjIFdlaWdodGVkIFNhbXBsZQoKYGBge3J9CnBsb3RBX3cgPC0gbnl0c19kYXRhICU+JQogICAgbXV0YXRlKHRvYmFjY29fc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgdG9iYWNjb19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSkgJT4lCiAgICBtdXRhdGUodG9iYWNjb19ldmVyID0gY2FzZV93aGVuKHRvYmFjY29fc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9iYWNjb19zdW1fZXZlciA9PTAgfiBGQUxTRSksCiAgICAgICAgICAgdG9iYWNjb19jdXJyZW50ID0gY2FzZV93aGVuKHRvYmFjY29fc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9iYWNjb19zdW1fY3VycmVudCA9PTAgfiBGQUxTRSkpICU+JQogIGFzX3N1cnZleV9kZXNpZ24oc3RyYXRhID0gc3RyYXR1bSwgaWRzID0gcHN1LCB3ZWlnaHQgID0gZmlud2d0LCBuZXN0PVRSVUUpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvYmFjY29fZXZlcl95ZWFyID0gc3VydmV5X21lYW4odG9iYWNjb19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIHRvYmFjY29fY3VycmVudF95ZWFyID0gc3VydmV5X21lYW4odG9iYWNjb19jdXJyZW50LCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSkpICAlPiUKICBtdXRhdGVfYXQodmFycygteWVhciksICIqIiwgMTAwKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIlR5cGUiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpICU+JQogICAgIyBnYXRoZXIoa2V5PVR5cGUsCiAgICAjICAgICAgICB2YWx1ZT1gUGVyY2VudGFnZSBvZiBzdHVkZW50c2AsCiAgICAjICAgICAgICAteWVhcikgJT4lCiAgbXV0YXRlKEVzdGltYXRlID0gY2FzZV93aGVuKGdyZXBsKCJfbG93IiwgVHlwZSkgfiAiTG93ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJfdXBwIiwgVHlwZSkgfiAiVXBwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTWVhbiIpLAogICAgICAgICBVc2VyID0gY2FzZV93aGVuKGdyZXBsKCJldmVyIiwgVHlwZSkgfiAiRXZlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImN1cnJlbnQiLCBUeXBlKSB+ICJDdXJyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk1lYW4iKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtVHlwZSkgJT4lCiMgIHBpdm90X3dpZGVyX3NwZWMoKQogIHNwcmVhZChFc3RpbWF0ZSwgYFBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHNgKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhcix5PU1lYW4pKSArCiAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1Vc2VyKSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygyLDEpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsNzAsYnk9MTApLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNlcSgwLDcwLGJ5PTEwKSwKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsNzApKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHRpdGxlID0gIk5pY290aW5lIHByb2R1Y3QgdXNlcnMgbW9yZSBwcmV2YWxlbnQgYWZ0ZXIgMjAxNyIsCiAgICAgICAgIHkgPSAiJSBvZiBzdHVkZW50cyIpCgpwbG90Ql93IDwtIG55dHNfZGF0YSAlPiUKICAgIG11dGF0ZShlY2lnX3N1bV9ldmVyID0gc2VsZWN0KC4sIEVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPSBzZWxlY3QoLiwgQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIHNlbGVjdCguLC1FRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUNFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpKSAlPiUKICAgIG11dGF0ZShlY2lnX2V2ZXIgPSBjYXNlX3doZW4oZWNpZ19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBlY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4oZWNpZ19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19ldmVyID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19jdXJyZW50ID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSkgJT4lCiAgYXNfc3VydmV5X2Rlc2lnbihzdHJhdGEgPSBzdHJhdHVtLCBpZHMgPSBwc3UsIHdlaWdodCAgPSBmaW53Z3QsIG5lc3Q9VFJVRSkgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShlY2lnX2V2ZXJfeWVhciA9IHN1cnZleV9tZWFuKGVjaWdfZXZlciwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBlY2lnX2N1cnJlbnRfeWVhciA9IHN1cnZleV9tZWFuKGVjaWdfY3VycmVudCwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBub25fZWNpZ19ldmVyX3llYXIgPSBzdXJ2ZXlfbWVhbihub25fZWNpZ19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhciA9IHN1cnZleV9tZWFuKG5vbl9lY2lnX2N1cnJlbnQsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXllYXIpLCAiKiIsIDEwMCkgJT4lCiAgZHBseXI6OnNlbGVjdCh5ZWFyLAogICAgICAgICAgICAgICAgZWNpZ19ldmVyX3llYXIsCiAgICAgICAgICAgICAgICBlY2lnX2N1cnJlbnRfeWVhciwKICAgICAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXJfeWVhciwKICAgICAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhciwKICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJsb3ciKSwKICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJ1cHAiKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAteWVhciwgbmFtZXNfdG8gPSAiQ2F0ZWdvcnkiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpICU+JQogICAgIyBnYXRoZXIoa2V5PUNhdGVnb3J5LAogICAgIyAgICAgICAgdmFsdWU9YFBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHNgLAogICAgIyAgICAgICAgLXllYXIpICAlPiUKICBtdXRhdGUoRXN0aW1hdGUgPSBjYXNlX3doZW4oZ3JlcGwoIl9sb3ciLCBDYXRlZ29yeSkgfiAiTG93ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJfdXBwIiwgQ2F0ZWdvcnkpIH4gIlVwcGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk1lYW4iKSwKICAgICAgICAgVXNlciA9IGNhc2Vfd2hlbihncmVwbCgiY3VycmVudCIsIENhdGVnb3J5KSB+ICJDdXJyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkV2ZXIiLCksCiAgICAgICAgIFByb2R1Y3QgPSBjYXNlX3doZW4oZ3JlcGwoIm5vbl9lY2lnIiwgQ2F0ZWdvcnkpIH4gIk90aGVyIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkUtY2lnYXJldHRlcyIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1DYXRlZ29yeSkgJT4lCiAgc3ByZWFkKEVzdGltYXRlLCBgUGVyY2VudGFnZSBvZiBzdHVkZW50c2ApICU+JQogIGZpbHRlcihVc2VyPT0iRXZlciIpICU+JQogIGRwbHlyOjpyZW5hbWUoIkxvd2VyX3RlbXAiID0gVXBwZXIsCiAgICAgICAgICAgICAgICAiVXBwZXJfdGVtcCIgPSBMb3dlcikgJT4lCiAgZHBseXI6OnJlbmFtZSgiTG93ZXIiPUxvd2VyX3RlbXAsCiAgICAgICAgICAgICAgICAiVXBwZXIiPVVwcGVyX3RlbXApICU+JQogICAgZ2dwbG90KGFlcyh4PXllYXIseT1NZWFuLCBjb2xvcj1Qcm9kdWN0KSkgKwogIGdlb21fbGluZShsaW5ldHlwZT0xKSArCiAgZ2VvbV9saW5lcmFuZ2UoYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMTAsIDYwLCBieSA9IDEwKSwgbGltaXRzID0gYygxMCw2MCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiJSBldmVyIHRyeWluZyBlLWNpZ2FyZXR0ZXMgaW5jcmVhc2VzICZcbiUgZXZlciB0cnlpbmcgb3RoZXIgcHJvZHVjdHMgZGVjcmVhc2VzIiwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCiMjIyMgdGhlIHdyYW5nbGluZyBsb29rcyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgcGxvdC4uLgpwbG90Q193IDwtIG55dHNfZGF0YSAlPiUKICAgIG11dGF0ZShlY2lnX3N1bV9ldmVyID0gc2VsZWN0KC4sIEVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPSBzZWxlY3QoLiwgQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIHNlbGVjdCguLC1FRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUNFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpKSAlPiUKICAgIG11dGF0ZShlY2lnX2V2ZXIgPSBjYXNlX3doZW4oZWNpZ19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBlY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4oZWNpZ19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19ldmVyID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19jdXJyZW50ID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSkgJT4lCiAgYXNfc3VydmV5X2Rlc2lnbihzdHJhdGEgPSBzdHJhdHVtLCBpZHMgPSBwc3UsIHdlaWdodCAgPSBmaW53Z3QsIG5lc3Q9VFJVRSkgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpc2UoZWNpZ19ldmVyX3llYXIgPSBzdXJ2ZXlfbWVhbihlY2lnX2V2ZXIsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgZWNpZ19jdXJyZW50X3llYXIgPSBzdXJ2ZXlfbWVhbihlY2lnX2N1cnJlbnQsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgbm9uX2VjaWdfZXZlcl95ZWFyID0gc3VydmV5X21lYW4obm9uX2VjaWdfZXZlciwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBub25fZWNpZ19jdXJyZW50X3llYXIgPSBzdXJ2ZXlfbWVhbihub25fZWNpZ19jdXJyZW50LCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKC15ZWFyKSwgIioiLCAxMDApICU+JQogIGRwbHlyOjpzZWxlY3QoeWVhciwKICAgICAgICAgICAgICAgIGVjaWdfZXZlcl95ZWFyLAogICAgICAgICAgICAgICAgZWNpZ19jdXJyZW50X3llYXIsCiAgICAgICAgICAgICAgICBub25fZWNpZ19ldmVyX3llYXIsCiAgICAgICAgICAgICAgICBub25fZWNpZ19jdXJyZW50X3llYXIsCiAgICAgICAgICAgICAgICBjb250YWlucygibG93IiksCiAgICAgICAgICAgICAgICBjb250YWlucygidXBwIikpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIkNhdGVnb3J5IiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHMiKSAlPiUKICAgICMgZ2F0aGVyKGtleT1DYXRlZ29yeSwKICAgICMgICAgICAgIHZhbHVlPWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwKICAgICMgICAgICAgIC15ZWFyKSAlPiUKICAgIG11dGF0ZShFc3RpbWF0ZSA9IGNhc2Vfd2hlbihncmVwbCgiX2xvdyIsIENhdGVnb3J5KSB+ICJMb3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl91cHAiLCBDYXRlZ29yeSkgfiAiVXBwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTWVhbiIpLAogICAgICAgICBVc2VyID0gY2FzZV93aGVuKGdyZXBsKCJldmVyIiwgQ2F0ZWdvcnkpIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJjdXJyZW50IiwgQ2F0ZWdvcnkpIH4gIkN1cnJlbnQiKSwKICAgICAgICAgUHJvZHVjdCA9IGNhc2Vfd2hlbihncmVwbCgibm9uX2VjaWciLCBDYXRlZ29yeSkgfiAiT3RoZXIgcHJvZHVjdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiRS1jaWdhcmV0dGVzIikpICU+JQogIGRwbHlyOjpzZWxlY3QoLUNhdGVnb3J5KSAlPiUKICBzcHJlYWQoRXN0aW1hdGUsIGBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PU1lYW4sIGNvbG9yPVByb2R1Y3QpKSArCiAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1Vc2VyKSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygyLDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgYnkgPSAxMCksIGxpbWl0cyA9IGMoMCw2MCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiJSBVc2luZyBlLWNpZ2FyZXR0ZXMgaW5jcmVhc2VzICZcbiUgdXNpbmcgT3RoZXIgcHJvZHVjdHMgZGVjcmVhc2VzIiwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCnRpdGxlX3cgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKAogICAgZXhwcmVzc2lvbigiSGF2ZSB2YXBpbmcgcmF0ZXMgcG9zc2libHkgaW5mbHVlbmNlZCB0b2JhY2NvL25pY290aW5lIHVzZT8iKSwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLAogICAgaGp1c3QgPSAwCiAgKSArCiAgdGhlbWUoCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQogICkKCnBsb3RzQV93IDwtIHBsb3RfZ3JpZChwbG90QV93LAogICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygxKSwKICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAidiIsCiAgICAgICAgICAgICAgICAgICAgIGF4aXMgPSAiYnQiKQpwbG90c0JDX3cgPC0gcGxvdF9ncmlkKHBsb3RCX3csCiAgICAgICAgICAgICAgICAgICAgIHBsb3RDX3csCiAgICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsMSksCiAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gInYiLAogICAgICAgICAgICAgICAgICAgICBheGlzID0gImJ0IikKCmxlZ2VuZF93IDwtIGdldF9sZWdlbmQocGxvdEJfdyArCiAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikpCgpmaWd1cmVfdyA8LSBwbG90X2dyaWQodGl0bGVfdywKICAgICAgICAgICAgICAgICAgICAgIHBsb3RzQV93LAogICAgICAgICAgICAgICAgICAgICAgcGxvdHNCQ193LAogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kX3csCiAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSksCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IDEuMCkKCmZpZ3VyZV93CmBgYAoKIyMjIEh5cG90aGV0aGljYWwgQ29ob3J0CgpgYGB7cn0KcGxvdEFfd184IDwtIG55dHNfZGF0YSAlPiUKICBmaWx0ZXIoKEdyYWRlID09ICI4IiAmIHllYXIgPT0gMjAxNSkgfAogICAgICAgICAoR3JhZGUgPT0gIjkiICYgeWVhciA9PSAyMDE2KSB8CiAgICAgICAgIChHcmFkZSA9PSAiMTAiICYgeWVhciA9PSAyMDE3KSB8CiAgICAgICAgIChHcmFkZSA9PSAiMTEiICYgeWVhciA9PSAyMDE4KSB8CiAgICAgICAgICAoR3JhZGUgPT0gIjEyIiAmIHllYXIgPT0gMjAxOSkgCiAgICAgICAgICkgJT4lCiAgICBtdXRhdGUodG9iYWNjb19zdW1fZXZlciA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICB0b2JhY2NvX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJDIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpKSAlPiUKICAgIG11dGF0ZSh0b2JhY2NvX2V2ZXIgPSBjYXNlX3doZW4odG9iYWNjb19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2JhY2NvX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICB0b2JhY2NvX2N1cnJlbnQgPSBjYXNlX3doZW4odG9iYWNjb19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2JhY2NvX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSkgJT4lCiAgYXNfc3VydmV5X2Rlc2lnbihzdHJhdGEgPSBzdHJhdHVtLCBpZHMgPSBwc3UsIHdlaWdodCAgPSBmaW53Z3QpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvYmFjY29fZXZlcl95ZWFyID0gc3VydmV5X21lYW4odG9iYWNjb19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIHRvYmFjY29fY3VycmVudF95ZWFyID0gc3VydmV5X21lYW4odG9iYWNjb19jdXJyZW50LCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSkpICAlPiUKICBtdXRhdGVfYXQodmFycygteWVhciksICIqIiwgMTAwKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIlR5cGUiLCB2YWx1ZXNfdG8gPSAiUGVyY2VudGFnZSBvZiBzdHVkZW50cyIpJT4lCiAgICAjIGdhdGhlcihrZXk9VHlwZSwKICAgICMgICAgICAgIHZhbHVlPWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwKICAgICMgICAgICAgIC15ZWFyKSAlPiUKICBtdXRhdGUoRXN0aW1hdGUgPSBjYXNlX3doZW4oZ3JlcGwoIl9sb3ciLCBUeXBlKSB+ICJMb3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl91cHAiLCBUeXBlKSB+ICJVcHBlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJNZWFuIiksCiAgICAgICAgIFVzZXIgPSBjYXNlX3doZW4oZ3JlcGwoImV2ZXIiLCBUeXBlKSB+ICJFdmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiY3VycmVudCIsIFR5cGUpIH4gIkN1cnJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTWVhbiIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1UeXBlKSAlPiUKICBzcHJlYWQoRXN0aW1hdGUsIGBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCkgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIseT1NZWFuKSkgKwogIGdlb21fbGluZShhZXMobGluZXR5cGU9VXNlcikpICsKICBnZW9tX2xpbmVyYW5nZShhZXMoeW1pbiA9IExvd2VyLCB5bWF4ID0gVXBwZXIpKSArIAogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIsMSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCw3MCxieT0xMCksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2VxKDAsNzAsYnk9MTApLAogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCw3MCkpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGxhYnModGl0bGUgPSAiTmljb3RpbmUgcHJvZHVjdCB1c2VycyBiZWNvbWluZyBpbmNyZWFzaW5nbHkgcHJldmFsZW50IiwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCnBsb3RCX3dfOCA8LSBueXRzX2RhdGEgJT4lCiAgZmlsdGVyKChHcmFkZSA9PSAiOCIgJiB5ZWFyID09IDIwMTUpIHwKICAgICAgICAgKEdyYWRlID09ICI5IiAmIHllYXIgPT0gMjAxNikgfAogICAgICAgICAoR3JhZGUgPT0gIjEwIiAmIHllYXIgPT0gMjAxNykgfAogICAgICAgICAoR3JhZGUgPT0gIjExIiAmIHllYXIgPT0gMjAxOCkgfAogICAgICAgICAgKEdyYWRlID09ICIxMiIgJiB5ZWFyID09IDIwMTkpIAogICAgICAgICApICU+JQogICAgbXV0YXRlKGVjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgRUVMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBDRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fZXZlciA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiRSIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJDIiwgaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQogICAgICAgICAgICAgICBzZWxlY3QoLiwtQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSkpICU+JQogICAgbXV0YXRlKGVjaWdfZXZlciA9IGNhc2Vfd2hlbihlY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIGVjaWdfY3VycmVudCA9IGNhc2Vfd2hlbihlY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2V2ZXIgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2V2ZXIgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPT0wIH4gRkFMU0UpLAogICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4obm9uX2VjaWdfc3VtX2N1cnJlbnQgPiAwIH4gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX2VjaWdfc3VtX2N1cnJlbnQgPT0wIH4gRkFMU0UpKSAlPiUKICBhc19zdXJ2ZXlfZGVzaWduKHN0cmF0YSA9IHN0cmF0dW0sIGlkcyA9IHBzdSwgd2VpZ2h0ICA9IGZpbndndCkgJT4lCiAgICBncm91cF9ieSh5ZWFyKSAlPiUKICAgIHN1bW1hcmlzZShlY2lnX2V2ZXJfeWVhciA9IHN1cnZleV9tZWFuKGVjaWdfZXZlciwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBlY2lnX2N1cnJlbnRfeWVhciA9IHN1cnZleV9tZWFuKGVjaWdfY3VycmVudCwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpLAogICAgICAgICAgICBub25fZWNpZ19ldmVyX3llYXIgPSBzdXJ2ZXlfbWVhbihub25fZWNpZ19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhciA9IHN1cnZleV9tZWFuKG5vbl9lY2lnX2N1cnJlbnQsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXllYXIpLCAiKiIsIDEwMCkgJT4lCiAgZHBseXI6OnNlbGVjdCh5ZWFyLAogICAgICAgICAgICAgICAgZWNpZ19ldmVyX3llYXIsCiAgICAgICAgICAgICAgICBlY2lnX2N1cnJlbnRfeWVhciwKICAgICAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXJfeWVhciwKICAgICAgICAgICAgICAgIG5vbl9lY2lnX2N1cnJlbnRfeWVhciwKICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJsb3ciKSwKICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJ1cHAiKSkgJT4lCiAgIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gIkNhdGVnb3J5IiwgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHMiKSU+JQogICAgIyBnYXRoZXIoa2V5PUNhdGVnb3J5LAogICAgIyAgICAgICAgdmFsdWU9YFBlcmNlbnRhZ2Ugb2Ygc3R1ZGVudHNgLAogICAgIyAgICAgICAgLXllYXIpICAlPiUKICBtdXRhdGUoRXN0aW1hdGUgPSBjYXNlX3doZW4oZ3JlcGwoIl9sb3ciLCBDYXRlZ29yeSkgfiAiTG93ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJfdXBwIiwgQ2F0ZWdvcnkpIH4gIlVwcGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk1lYW4iKSwKICAgICAgICAgVXNlciA9IGNhc2Vfd2hlbihncmVwbCgiY3VycmVudCIsIENhdGVnb3J5KSB+ICJDdXJyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkV2ZXIiLCksCiAgICAgICAgIFByb2R1Y3QgPSBjYXNlX3doZW4oZ3JlcGwoIm5vbl9lY2lnIiwgQ2F0ZWdvcnkpIH4gIk90aGVyIHByb2R1Y3RzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkUtY2lnYXJldHRlcyIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1DYXRlZ29yeSkgJT4lCiAgc3ByZWFkKEVzdGltYXRlLCBgUGVyY2VudGFnZSBvZiBzdHVkZW50c2ApICU+JQogIGZpbHRlcihVc2VyPT0iRXZlciIpICU+JQogIGRwbHlyOjpyZW5hbWUoIkxvd2VyX3RlbXAiID0gVXBwZXIsCiAgICAgICAgICAgICAgICAiVXBwZXJfdGVtcCIgPSBMb3dlcikgJT4lCiAgZHBseXI6OnJlbmFtZSgiTG93ZXIiPUxvd2VyX3RlbXAsCiAgICAgICAgICAgICAgICAiVXBwZXIiPVVwcGVyX3RlbXApICU+JQogIGdncGxvdChhZXMoeD15ZWFyLHk9TWVhbiwgY29sb3I9UHJvZHVjdCkpICsKICBnZW9tX2xpbmUobGluZXR5cGU9MSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlcikpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxMCwgNjAsIGJ5ID0gMTApLCBsaW1pdHMgPSBjKDEwLDYwKSkgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgbGFicyh0aXRsZSA9ICIlIGV2ZXIgdHJ5aW5nIG5pY290aW5lIHByb2R1Y3RzIGluY3JlYXNlcyIsCiAgICAgICAgIHkgPSAiJSBvZiBzdHVkZW50cyIpCgpwbG90Q193XzggPC0gbnl0c19kYXRhICU+JQogIGZpbHRlcigoR3JhZGUgPT0gIjgiICYgeWVhciA9PSAyMDE1KSB8CiAgICAgICAgIChHcmFkZSA9PSAiOSIgJiB5ZWFyID09IDIwMTYpIHwKICAgICAgICAgKEdyYWRlID09ICIxMCIgJiB5ZWFyID09IDIwMTcpIHwKICAgICAgICAgKEdyYWRlID09ICIxMSIgJiB5ZWFyID09IDIwMTgpIHwKICAgICAgICAgIChHcmFkZSA9PSAiMTIiICYgeWVhciA9PSAyMDE5KSAKICAgICAgICAgKSAlPiUKICAgIG11dGF0ZShlY2lnX3N1bV9ldmVyID0gc2VsZWN0KC4sIEVFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpLAogICAgICAgICAgIGVjaWdfc3VtX2N1cnJlbnQgPSBzZWxlY3QoLiwgQ0VMQ0lHVCkgJT4lCiAgICAgICAgICAgICAgIGFwcGx5KDEsIHN1bSwgbmEucm09VFJVRSksCiAgICAgICAgICAgbm9uX2VjaWdfc3VtX2V2ZXIgPSBzZWxlY3QoLiwgc3RhcnRzX3dpdGgoIkUiLCBpZ25vcmUuY2FzZSA9IEZBTFNFKSkgJT4lCiAgICAgICAgICAgICAgIHNlbGVjdCguLC1FRUxDSUdUKSAlPiUKICAgICAgICAgICAgICAgYXBwbHkoMSwgc3VtLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICBub25fZWNpZ19zdW1fY3VycmVudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgiQyIsIGlnbm9yZS5jYXNlID0gRkFMU0UpKSAlPiUKICAgICAgICAgICAgICAgc2VsZWN0KC4sLUNFTENJR1QpICU+JQogICAgICAgICAgICAgICBhcHBseSgxLCBzdW0sIG5hLnJtPVRSVUUpKSAlPiUKICAgIG11dGF0ZShlY2lnX2V2ZXIgPSBjYXNlX3doZW4oZWNpZ19zdW1fZXZlciA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBlY2lnX2N1cnJlbnQgPSBjYXNlX3doZW4oZWNpZ19zdW1fY3VycmVudCA+IDAgfiBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19ldmVyID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9ldmVyID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9ldmVyID09MCB+IEZBTFNFKSwKICAgICAgICAgICBub25fZWNpZ19jdXJyZW50ID0gY2FzZV93aGVuKG5vbl9lY2lnX3N1bV9jdXJyZW50ID4gMCB+IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9lY2lnX3N1bV9jdXJyZW50ID09MCB+IEZBTFNFKSkgJT4lCiAgYXNfc3VydmV5X2Rlc2lnbihzdHJhdGEgPSBzdHJhdHVtLCBpZHMgPSBwc3UsIHdlaWdodCAgPSBmaW53Z3QpICU+JQogICAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKGVjaWdfZXZlcl95ZWFyID0gc3VydmV5X21lYW4oZWNpZ19ldmVyLCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIGVjaWdfY3VycmVudF95ZWFyID0gc3VydmV5X21lYW4oZWNpZ19jdXJyZW50LCB2YXJ0eXBlID0gImNpIiwgbmEucm09VFJVRSksCiAgICAgICAgICAgIG5vbl9lY2lnX2V2ZXJfeWVhciA9IHN1cnZleV9tZWFuKG5vbl9lY2lnX2V2ZXIsIHZhcnR5cGUgPSAiY2kiLCBuYS5ybT1UUlVFKSwKICAgICAgICAgICAgbm9uX2VjaWdfY3VycmVudF95ZWFyID0gc3VydmV5X21lYW4obm9uX2VjaWdfY3VycmVudCwgdmFydHlwZSA9ICJjaSIsIG5hLnJtPVRSVUUpKSAlPiUKICBtdXRhdGVfYXQodmFycygteWVhciksICIqIiwgMTAwKSAlPiUKICBkcGx5cjo6c2VsZWN0KHllYXIsCiAgICAgICAgICAgICAgICBlY2lnX2V2ZXJfeWVhciwKICAgICAgICAgICAgICAgIGVjaWdfY3VycmVudF95ZWFyLAogICAgICAgICAgICAgICAgbm9uX2VjaWdfZXZlcl95ZWFyLAogICAgICAgICAgICAgICAgbm9uX2VjaWdfY3VycmVudF95ZWFyLAogICAgICAgICAgICAgICAgY29udGFpbnMoImxvdyIpLAogICAgICAgICAgICAgICAgY29udGFpbnMoInVwcCIpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC15ZWFyLCBuYW1lc190byA9ICJDYXRlZ29yeSIsIHZhbHVlc190byA9ICJQZXJjZW50YWdlIG9mIHN0dWRlbnRzIiklPiUKICAgICMgZ2F0aGVyKGtleT1DYXRlZ29yeSwKICAgICMgICAgICAgIHZhbHVlPWBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCwKICAgICMgICAgICAgIC15ZWFyKSAlPiUKICAgIG11dGF0ZShFc3RpbWF0ZSA9IGNhc2Vfd2hlbihncmVwbCgiX2xvdyIsIENhdGVnb3J5KSB+ICJMb3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl91cHAiLCBDYXRlZ29yeSkgfiAiVXBwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTWVhbiIpLAogICAgICAgICBVc2VyID0gY2FzZV93aGVuKGdyZXBsKCJldmVyIiwgQ2F0ZWdvcnkpIH4gIkV2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJjdXJyZW50IiwgQ2F0ZWdvcnkpIH4gIkN1cnJlbnQiKSwKICAgICAgICAgUHJvZHVjdCA9IGNhc2Vfd2hlbihncmVwbCgibm9uX2VjaWciLCBDYXRlZ29yeSkgfiAiT3RoZXIgcHJvZHVjdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiRS1jaWdhcmV0dGVzIikpICU+JQogIGRwbHlyOjpzZWxlY3QoLUNhdGVnb3J5KSAlPiUKICBzcHJlYWQoRXN0aW1hdGUsIGBQZXJjZW50YWdlIG9mIHN0dWRlbnRzYCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHg9eWVhcix5PU1lYW4sIGNvbG9yPVByb2R1Y3QpKSArCiAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZT1Vc2VyKSkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlcikpICsgCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoMiwxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNjAsIGJ5ID0gMTApLCBsaW1pdHMgPSBjKDAsNjApKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBsYWJzKHRpdGxlID0gIkUtY2lnYXJldHRlIHVzZSBzdXJwYXNzZXMgdXNlIG9mIG90aGVyIG5pY290aW5lIHByb2R1Y3RzIiwKICAgICAgICAgeSA9ICIlIG9mIHN0dWRlbnRzIikKCnRpdGxlX3dfOCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKCJBbW9uZyJ+OF50aH4iZ3JhZGVycyBpbiAyMDE1LCBoYXZlIHZhcGluZyByYXRlcyBwb3NzaWJseSBpbmZsdWVuY2VkIHRvYmFjY28vbmljb3RpbmUgdXNlPyIpLAogICAgZm9udGZhY2UgPSAnYm9sZCcsCiAgICBzaXplPTE0LAogICAgeCA9IDAsCiAgICBoanVzdCA9IDAKICApICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKcGxvdHNBX3dfOCA8LSBwbG90X2dyaWQocGxvdEFfd184LAogICAgICAgICAgICAgICAgICAgICAgICByZWxfd2lkdGhzID0gYygxKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAidiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMgPSAiYnQiKQoKcGxvdHNCQ193XzggPC0gcGxvdF9ncmlkKHBsb3RCX3dfOCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RDX3dfOCwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsMSksCiAgICAgICAgICAgICAgICAgICAgICAgICBheGlzID0gImJ0IikKCmxlZ2VuZF93XzggPC0gZ2V0X2xlZ2VuZChwbG90Ql93XzggKwogICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpKQoKZmlndXJlX3dfOCA8LSBwbG90X2dyaWQodGl0bGVfd184LAogICAgICAgICAgICAgICAgICAgICAgICBwbG90c0Ffd184LAogICAgICAgICAgICAgICAgICAgICAgICBwbG90c0JDX3dfOCwKICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kX3dfOCwKICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSksCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gMS4wCikKCmZpZ3VyZV93XzgKYGBgCgojIyMgRmluYWwgRmlndXJlCgpgYGB7cn0KdGl0bGVfZmluYWwgPC0gZ2dkcmF3KCkgKwogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKCJIYXZlIHZhcGluZyByYXRlcyBwb3NzaWJseSBpbmZsdWVuY2VkIHRvYmFjY28vbmljb3RpbmUgdXNlPyIpLAogICAgZm9udGZhY2UgPSAnYm9sZCcsCiAgICBzaXplPTE2LAogICAgeCA9IDAuNSkgKwogIHRoZW1lKAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMCkKICApCgpzdWJ0aXRsZV91d19maW5hbCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKH42XnRofiItIn4xMl50aH4iZ3JhZGVycywgdW53ZWlnaHRlZCIpLAogICAgc2l6ZT0xMiwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKc3VidGl0bGVfd19maW5hbCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKH42XnRofiItIn4xMl50aH4iZ3JhZGVycywgd2VpZ2h0ZWQiKSwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xMiwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKc3VidGl0bGVfd184X2ZpbmFsIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgKICAgIGV4cHJlc3Npb24ofjhedGh+ImdyYWRlcnMgaW4gMjAxNSwgd2VpZ2h0ZWQiKSwKICAgIGZvbnRmYWNlID0gJ2JvbGQnLAogICAgc2l6ZT0xMiwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKc3VidGl0bGVfZmluYWwgPC0gcGxvdF9ncmlkKHN1YnRpdGxlX3V3X2ZpbmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGVfd19maW5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlX3dfOF9maW5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAzKQoKcGxvdHNBX3RpdGxlX2ZpbmFsIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgKICAgIGV4cHJlc3Npb24oIlByZXZhbGVuY2Ugb2YgZS1jaWdhcmV0dGUgdXNlIGJ5IHVzZXIgdHlwZSIpLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKcGxvdHNBX2ZpbmFsIDwtIHBsb3RfZ3JpZChwbG90QV91dyArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RBX3cgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90QV93XzggKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICJ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzID0gImJ0IikKCnBsb3RzQl90aXRsZV9maW5hbCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKCJQcmV2YWxlbmNlIG9mIGV2ZXIgdXNlIGJ5IHByb2R1Y3QgdHlwZSIpLAogICAgc2l6ZT0xNCwKICAgIHggPSAwLjUpICsKICB0aGVtZSgKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApCiAgKQoKcGxvdHNCX2ZpbmFsIDwtIHBsb3RfZ3JpZChwbG90Ql91dyArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RCX3cgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90Ql93XzggKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICJ2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzID0gImJ0IikKCnBsb3RzQ190aXRsZV9maW5hbCA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoCiAgICBleHByZXNzaW9uKCJQcmV2YWxlbmNlIG9mIG5pY290aW5lIHByb2R1Y3QgdXNlIGJ5IHByb2R1Y3QgJiB1c2VyIHR5cGUiKSwKICAgIHNpemU9MTQsCiAgICB4ID0gMC41KSArCiAgdGhlbWUoCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKQogICkKCnBsb3RzQ19maW5hbCA8LSBwbG90X2dyaWQocGxvdENfdXcgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90Q193ICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdENfd184ICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAidiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcyA9ICJidCIpCgpsZWdlbmRfZmluYWwgPC0gZ2V0X2xlZ2VuZChwbG90Ql93ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSkKCmZpbmFsX3Bsb3QgPC0gcGxvdF9ncmlkKHRpdGxlX2ZpbmFsLAogICAgICAgICAgcGxvdHNBX3RpdGxlX2ZpbmFsLAogICAgICAgICAgc3VidGl0bGVfZmluYWwsCiAgICAgICAgICBwbG90c0FfZmluYWwsCiAgICAgICAgICBwbG90c0JfdGl0bGVfZmluYWwsCiAgICAgICAgICBzdWJ0aXRsZV9maW5hbCwKICAgICAgICAgIHBsb3RzQl9maW5hbCwKICAgICAgICAgIHBsb3RzQ190aXRsZV9maW5hbCwKICAgICAgICAgIHN1YnRpdGxlX2ZpbmFsLAogICAgICAgICAgcGxvdHNDX2ZpbmFsLAogICAgICAgICAgbGVnZW5kX2ZpbmFsLAogICAgICAgICAgbmNvbCA9IDEsCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xLAogICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSkpCgpmaW5hbF9wbG90CmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZSgiZmluYWxfcGxvdC5wbmciKQpgYGAKCiMgSG9tZXdvcmsgcXVlc3Rpb25zCgo8c3R5bGU+CmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojZTZmMGZmOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQo8L3N0eWxlPgo8ZGl2IGNsYXNzID0gImJsdWUiPgoKKyBBcHBseSBzdXJ2ZXkgd2VpZ2h0cyB0byBvbmUgb2YgdGhlIGZpZ3VyZXMgcHJvZHVjZWQgaW4gdGhpcyBjYXNlIHN0dWR5IGluIHdoaWNoIHdlaWdodGVkIGVzdGltYXRlcyB3ZXJlIG5vdCBwcm9kdWNlZC4gSW5jbHVkZSBlcnJvciBiYXJzIGluIHRoZSB1cGRhdGVkIGZpZ3VyZS4KICAgICsgRG9lcyB0aGUgZmlndXJlIGNoYW5nZSBhZnRlciB0aGUgYXBwbGljYXRpb24gb2Ygc3VydmV5IHdlaWdodHM/CiAgICArIElmIHNvLCBkZXNjcmliZSBob3cuIAorIFJlcHJvZHVjZSBgZmluYWxfcGxvdGAgYWJvdmUgZm9yIGEgZGlmZmVyZW50IGNvaG9ydCBvZiB5b3VyIGNob2ljZS4KCjwvZGl2PgoKIyBOb3RlcwoKRXZlciBhbmQgY3VycmVudCB2YXJpYWJsZXMgYXJlIGxpbWl0ZWQgdG8gdGhvc2Ugc2hhcmVkIGJ5IGFsbCB5ZWFycyBvZiBkYXRhIGluY2x1ZGVkIGluIHRoaXMgY2FzZSBzdHVkeS4KCmBgYHtyLCBlY2hvPUZBTFNFfQprbml0X3RpbWVfZW5kIDwtIFN5cy50aW1lKCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0Ka25pdF90aW1lIDwtIGtuaXRfdGltZV9lbmQgLSBrbml0X3RpbWVfc3RhcnQKa25pdF90aW1lX21lc3NhZ2UgPC0gcGFzdGUoIktuaXQgdGltZToiLAogICAgICByb3VuZChhcy5udW1lcmljKGtuaXRfdGltZSkgLDMpLAogICAgICB1bml0cyhrbml0X3RpbWUpCiAgICAgICkKYGBgCgo8cCBzdHlsZT0iY29sb3I6cmVkIj5OZXcgY29kZTogYHIga25pdF90aW1lX21lc3NhZ2VgLiBQcmV2aW91cyBjb2RlOiB+IDMgbS4gPC9wPgoKIyBQcm9ibGVtcwoKSSBoYWQgZGlmZmljdWx0eSBwcm9kdWNpbmcgYSBwbG90IHRoYXQgc3VjY2luY3RseSBwcmVzZW50ZWQgYSB0cmVuZC4gSXQncyB2ZXJ5IGVhc3kgdG8gcHJvZHVjZSBwbG90cyB0aGF0IGFyZSB2ZXJ5IHVzZWZ1bCBvbmNlIG9uZSBpcyBmYW1pbGlhciB3aXRoIHRoZSBkYXRhLiBTb21lIHBsb3RzLCBob3dldmVyLCBjYW5ub3Qgc3RhbmQgYWxvbmUgYW5kIG5lZWQgYWRkaXRpb25hbCBjb250ZXh0IHRvIGJlIGNsZWFyIGZvciB0aG9zZSB3aXRob3V0IHByaW9yIGtub3dsZWRnZSBvZiB0aGUgZGF0YS4gV2hlbiBJIGZpcnN0IHNoYXJlZCBhIHBsb3QgSSBoYWQgYmVlbiB3b3JraW5nIG9uIHdpdGggb3RoZXJzLCBpdCBiZWNhbWUgY2xlYXIgdGhhdCBpbiBteSBlZmZvcnQgdG8gcHJlc2VudCBhIGNvbXBsaWNhdGVkIGlkZWEgYnJpZWZseSBJIGhhZCBsZWZ0IG91dCBpbmZvcm1hdGlvbiB0aGF0IHdvdWxkIG1ha2UgdGhlIHRyZW5kIGVhc2lseSBpbnRlcnByZXRhYmxlLiBUbyBzb2x2ZSB0aGlzIGlzc3VlLCBJIGJlZ2FuIHRvIHByZXNlbnQgdmlzdWFsaXphdGlvbnMgb2YgdGhlIGRhdGEgYWxvbmdzaWRlIG15IG9yaWdpbmFsIHBsb3QuIFRoZSBmaW5hbCBmaWd1cmUgSSBjcmVhdGVkIGNvbnRhaW5lZCBzZXZlcmFsIGFkZGl0aW9uYWwgcGxvdHMsIGVhY2ggcHJlc2VudGluZyB0aGUgc2FtZSB0cmVuZCBhdCBhIGRpZmZlcmVudCBsZXZlbCB0aGFuIG15IGluaXRpYWwgcGxvdC4KCk15ICJjZW50ZXJwaWVjZSIgcGxvdCBpcyB0aGUgbWlkZGxlIHBsb3QgaW4gYGZpbmFsX3Bsb3RgLiBUaGUgOCBwbG90cyBhcm91bmQgaXQgaGVscCBwcm92aWRlIGEgdmVyeSBjbGVhciBwaWN0dXJlIG9mIHdoYXQgaXMgZ29pbmcgb24gaW4gdGhlIFVTIHdpdGggcmVnYXJkcyB0byBlLWNpZ2FyZXR0ZSB1c2UgYW5kIG5pY290aW5lIHByb2R1Y3QgdXNlIGF0IGxhcmdlLiBPbiBpdHMgb3duLCBpdCdzIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kIHRoZSB0cmVuZHMgaW4gdGhlIFVTIGFuZCBob3cgaW1wb3J0YW50IHRoZSB3ZWlnaHRpbmcgc2NoZW1lIGlzIGZvciBpbmZlcmVuY2UuIE9uY2UgeW91IGFkZCB0aGUgbGVmdCBhbmQgcmlnaHQgY29sdW1ucywgaXQncyBjbGVhciB3aGF0IGlzIGdvaW5nIG9uLiA=